From c66ec5fa20d33abf134892520179e32c2728e9b8 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Sun, 14 Mar 2021 19:12:24 -0400 Subject: [PATCH] [SV 59881] Handle vertical TAB consistently While parsing makefiles get_next_mword() was treating VTAB as a word character rather than a word separator. However, when using find_next_token(), for example in patsubst_expand_pat(), we treated VTAB as a word separator causing multiple words to appear where we didn't expect them. * src/makeint.h (END_OF_TOKEN): Change from a loop to a boolean check. * src/misc.c (end_of_token): Move the loop here. * src/read.c (get_next_mword): Skip whitespace, not just blank, to find the start of the word and use END_OF_TOKEN() to decide when the current word is finished. --- src/makeint.h | 2 +- src/misc.c | 3 ++- src/read.c | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/makeint.h b/src/makeint.h index 015bf5c2..fcfb7bdf 100644 --- a/src/makeint.h +++ b/src/makeint.h @@ -463,8 +463,8 @@ extern int unixy_shell; #define ISBLANK(c) STOP_SET((c),MAP_BLANK) #define ISSPACE(c) STOP_SET((c),MAP_SPACE) +#define END_OF_TOKEN(c) STOP_SET((c),MAP_SPACE|MAP_NUL) #define NEXT_TOKEN(s) while (ISSPACE (*(s))) ++(s) -#define END_OF_TOKEN(s) while (! STOP_SET (*(s), MAP_SPACE|MAP_NUL)) ++(s) /* We can't run setrlimit when using posix_spawn. */ #if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) && !defined(USE_POSIX_SPAWN) diff --git a/src/misc.c b/src/misc.c index bc5060a3..3072952c 100644 --- a/src/misc.c +++ b/src/misc.c @@ -308,7 +308,8 @@ lindex (const char *s, const char *limit, int c) char * end_of_token (const char *s) { - END_OF_TOKEN (s); + while (! END_OF_TOKEN (*s)) + ++s; return (char *)s; } diff --git a/src/read.c b/src/read.c index 3b4b0fe4..ac4dc845 100644 --- a/src/read.c +++ b/src/read.c @@ -2735,7 +2735,7 @@ get_next_mword (char *buffer, char **startp, size_t *length) char c; /* Skip any leading whitespace. */ - while (ISBLANK (*p)) + while (ISSPACE (*p)) ++p; beg = p; @@ -2821,11 +2821,11 @@ get_next_mword (char *buffer, char **startp, size_t *length) char closeparen; int count; + if (END_OF_TOKEN (c)) + goto done_word; + switch (c) { - case '\0': - case ' ': - case '\t': case '=': goto done_word;