summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Smith <psmith@gnu.org>2023-01-08 18:06:54 -0500
committerPaul Smith <psmith@gnu.org>2023-01-08 18:06:54 -0500
commit36f955b0e8d2c1b5be292eb84475c44eea6403c8 (patch)
treef6a545954d76b34db79b96ce6644429b9a674253 /src
parenta275f4e9ab14a2ff827b67b46dd3bc746cdba328 (diff)
downloadmake-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.c53
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')