diff options
author | Paul Smith <psmith@gnu.org> | 2023-01-08 18:06:54 -0500 |
---|---|---|
committer | Paul Smith <psmith@gnu.org> | 2023-01-08 18:06:54 -0500 |
commit | 36f955b0e8d2c1b5be292eb84475c44eea6403c8 (patch) | |
tree | f6a545954d76b34db79b96ce6644429b9a674253 /src | |
parent | a275f4e9ab14a2ff827b67b46dd3bc746cdba328 (diff) | |
download | make-git-36f955b0e8d2c1b5be292eb84475c44eea6403c8.tar.gz |
[SV 17448] Ignore whitespace around $(file ...) names
The other issues related to whitespace reported in this bug are
not addressed by this change.
* src/functions.c (func_file): Strip whitespace from the start and
end of the filename provided to the $(file ...) function.
* tests/scripts/functions/file: Add tests for this.
* tests/test_driver.pl: Use 3-arg version of open().
Diffstat (limited to 'src')
-rw-r--r-- | src/function.c | 53 |
1 files changed, 39 insertions, 14 deletions
diff --git a/src/function.c b/src/function.c index 00d09f3a..40b82e34 100644 --- a/src/function.c +++ b/src/function.c @@ -2327,6 +2327,10 @@ func_file (char *o, char **argv, const char *funcname UNUSED) if (fn[0] == '>') { + size_t len; + const char *end; + const char *start; + char *nm; FILE *fp; const char *mode = "w"; @@ -2337,14 +2341,21 @@ func_file (char *o, char **argv, const char *funcname UNUSED) mode = "a"; ++fn; } - NEXT_TOKEN (fn); - if (fn[0] == '\0') + start = next_token (fn); + + if (start[0] == '\0') O (fatal, *expanding_var, _("file: missing filename")); - ENULLLOOP (fp, fopen (fn, mode)); + end = end_of_token (start); + len = end - start; + nm = alloca (len + 1); + memcpy (nm, start, len); + nm[len] = '\0'; + + ENULLLOOP (fp, fopen (nm, mode)); if (fp == NULL) - OSS (fatal, reading_file, _("open: %s: %s"), fn, strerror (errno)); + OSS (fatal, reading_file, _("open: %s: %s"), nm, strerror (errno)); /* We've changed the contents of a directory, possibly. Another option would be to look up the directory we changed and reset @@ -2357,30 +2368,44 @@ func_file (char *o, char **argv, const char *funcname UNUSED) int nl = l == 0 || argv[1][l-1] != '\n'; if (fputs (argv[1], fp) == EOF || (nl && fputc ('\n', fp) == EOF)) - OSS (fatal, reading_file, _("write: %s: %s"), fn, strerror (errno)); + OSS (fatal, reading_file, _("write: %s: %s"), nm, strerror (errno)); } if (fclose (fp)) - OSS (fatal, reading_file, _("close: %s: %s"), fn, strerror (errno)); + OSS (fatal, reading_file, _("close: %s: %s"), nm, strerror (errno)); } else if (fn[0] == '<') { size_t n = 0; + size_t len; + const char *end; + const char *start; + char *nm; FILE *fp; - ++fn; - NEXT_TOKEN (fn); - if (fn[0] == '\0') + start = next_token (fn + 1); + + if (start[0] == '\0') O (fatal, *expanding_var, _("file: missing filename")); if (argv[1]) O (fatal, *expanding_var, _("file: too many arguments")); - ENULLLOOP (fp, fopen (fn, "r")); + end = end_of_token (start); + len = end - start; + nm = alloca (len + 1); + memcpy (nm, start, len); + nm[len] = '\0'; + + ENULLLOOP (fp, fopen (nm, "r")); if (fp == NULL) { if (errno == ENOENT) - return o; - OSS (fatal, reading_file, _("open: %s: %s"), fn, strerror (errno)); + { + DB (DB_VERBOSE, (_("file: Failed to open '%s': %s\n"), + nm, strerror (errno))); + return o; + } + OSS (fatal, reading_file, _("open: %s: %s"), nm, strerror (errno)); } while (1) @@ -2394,12 +2419,12 @@ func_file (char *o, char **argv, const char *funcname UNUSED) } if (ferror (fp)) if (errno != EINTR) - OSS (fatal, reading_file, _("read: %s: %s"), fn, strerror (errno)); + OSS (fatal, reading_file, _("read: %s: %s"), nm, strerror (errno)); if (feof (fp)) break; } if (fclose (fp)) - OSS (fatal, reading_file, _("close: %s: %s"), fn, strerror (errno)); + OSS (fatal, reading_file, _("close: %s: %s"), nm, strerror (errno)); /* Remove trailing newline. */ if (n && o[-1] == '\n') |