From 6796bc807aa3808f6afb5da42932e437bdd183cf Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sun, 6 Sep 1998 23:45:24 +0000 Subject: Update. 1998-09-06 09:53 -0400 Zack Weinberg * Makeconfig (+gccwarn): Remove -Wno-parentheses. * elf/dl-open.c: Quiet -Wparentheses warnings. * iconvdata/johab.c: Likewise. * iconvdata/uhc.c: Likewise. * inet/inet_net.c: Likewise. * io/fts.c: Likewise. * locale/newlocale.c: Likewise. * misc/getttyent.c: Likewise. * misc/mntent_r.c: Likewise. * misc/ttyslot.c: Likewise. * nscd/nscd_conf.c: Likewise. * nss/nsswitch.c: Likewise. * resolv/gethnamaddr.c: Likewise. * resolv/nsap_addr.c: Likewise. * resolv/res_debug.c: Likewise. * stdio-common/_itoa.c: Likewise. * stdlib/strtod.c: Likewise. * string/strverscmp.c: Likewise. * sunrpc/svc.c: Likewise. * sysdeps/libm-ieee754/e_cosh.c: Likewise. * sysdeps/libm-ieee754/e_gamma_r.c: Likewise. * sysdeps/libm-ieee754/e_sinh.c: Likewise. * sysdeps/posix/getaddrinfo.c: Likewise. * include/dlfcn.h: Likewise. * elf/dlfcn.h: Declare dladdr only for __USE_GNU. Define RTLD_DEFAULT. --- posix/wordexp-test.c | 7 ++++++- posix/wordexp.c | 30 ++++++++++++------------------ 2 files changed, 18 insertions(+), 19 deletions(-) (limited to 'posix') diff --git a/posix/wordexp-test.c b/posix/wordexp-test.c index 82af1666a2..d73021cc2e 100644 --- a/posix/wordexp-test.c +++ b/posix/wordexp-test.c @@ -119,6 +119,11 @@ struct test_case_struct { 0, "foo", "*$var*", 0, 1, { "*foo*", }, IFS }, { 0, "o thr", "*$var*", 0, 2, { "two", "three" }, IFS }, + /* Different IFS values */ + { 0, NULL, "a b\tc\nd ", 0, 4, { "a", "b", "c", "d" }, NULL /* unset */ }, + { 0, NULL, "a b\tc d ", 0, 1, { "a b\tc d " }, "" /* `null' */ }, + { 0, NULL, "a,b c\n, d", 0, 3, { "a", "b c", " d" }, "\t\n," }, + /* Other things that should succeed */ { 0, NULL, "\\*\"|&;<>\"\\(\\)\\{\\}", 0, 1, { "*|&;<>(){}", }, IFS }, { 0, "???", "$var", 0, 1, { "???", }, IFS }, @@ -127,7 +132,7 @@ struct test_case_struct { 0, NULL, "", 0, 0, { NULL, }, IFS }, /* Things that should fail */ - { WRDE_BADCHAR, NULL, "new\nline", 0, 0, { NULL, }, IFS }, + { WRDE_BADCHAR, NULL, "new\nline", 0, 0, { NULL, }, "" /* \n not IFS */ }, { WRDE_BADCHAR, NULL, "pipe|symbol", 0, 0, { NULL, }, IFS }, { WRDE_BADCHAR, NULL, "&ersand", 0, 0, { NULL, }, IFS }, { WRDE_BADCHAR, NULL, "semi;colon", 0, 0, { NULL, }, IFS }, diff --git a/posix/wordexp.c b/posix/wordexp.c index fe3e2b2cea..dff5d30dad 100644 --- a/posix/wordexp.c +++ b/posix/wordexp.c @@ -2049,8 +2049,8 @@ wordexp (const char *words, wordexp_t *pwordexp, int flags) ifs = getenv ("IFS"); if (!ifs) - /* NULL IFS means no field-splitting is to be performed */ - ifs = strcpy (ifs_white, ""); + /* IFS unset - use . */ + ifs = strcpy (ifs_white, " \t\n"); else { char *ifsch = ifs; @@ -2082,22 +2082,6 @@ wordexp (const char *words, wordexp_t *pwordexp, int flags) for (words_offset = 0 ; words[words_offset] ; ++words_offset) switch (words[words_offset]) { - case '\n': - case '|': - case '&': - case ';': - case '<': - case '>': - case '(': - case ')': - case '{': - case '}': - /* Fail */ - wordfree (pwordexp); - pwordexp->we_wordc = 0; - pwordexp->we_wordv = old_wordv; - return WRDE_BADCHAR; - case '\\': error = parse_backslash (&word, &word_length, &max_length, words, &words_offset); @@ -2175,6 +2159,16 @@ wordexp (const char *words, wordexp_t *pwordexp, int flags) /* Is it a field separator? */ if (strchr (ifs, words[words_offset]) == NULL) { + /* Not a field separator -- but is it a valid word char? */ + if (strchr ("\n|&;<>(){}", words[words_offset])) + { + /* Fail */ + wordfree (pwordexp); + pwordexp->we_wordc = 0; + pwordexp->we_wordv = old_wordv; + return WRDE_BADCHAR; + } + /* "Ordinary" character -- add it to word */ word = w_addchar (word, &word_length, &max_length, -- cgit v1.2.3