From d1abd3e7cf53fc271e9d7c5de4f84ad3e6be42c7 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Tue, 12 May 2009 11:11:14 +0000 Subject: 26957: Fix some memory problems with read builtin unposted: fix a WARN_CREATE_GLOBAL warning --- Src/builtin.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'Src') diff --git a/Src/builtin.c b/Src/builtin.c index d19ad01e2..86bb3bb9c 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -5085,16 +5085,16 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func)) if (OPT_ISSET(ops,'d')) { char *delimstr = OPT_ARG(ops,'d'); #ifdef MULTIBYTE_SUPPORT - wint_t wc; + wint_t wi; if (isset(MULTIBYTE)) { mb_metacharinit(); - (void)mb_metacharlenconv(delimstr, &wc); + (void)mb_metacharlenconv(delimstr, &wi); } else - wc = WEOF; - if (wc != WEOF) - delim = (wchar_t)wc; + wi = WEOF; + if (wi != WEOF) + delim = (wchar_t)wi; else delim = (wchar_t)((delimstr[0] == Meta) ? delimstr[1] ^ 32 : delimstr[0]); @@ -5358,8 +5358,12 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func)) wc = (wchar_t)c; } if (ret != MB_INCOMPLETE) { - if (ret == MB_INVALID) + if (ret == MB_INVALID) { memset(&mbs, 0, sizeof(mbs)); + /* Treat this as a single character */ + wc = (wchar_t)c; + laststart = bptr; + } if (bslash && wc == delim) { bslash = 0; continue; @@ -5450,9 +5454,10 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func)) } signal_setmask(s); #ifdef MULTIBYTE_SUPPORT - if (c == EOF) + if (c == EOF) { gotnl = 1; - if (ret == MB_INCOMPLETE) { + *bptr = '\0'; /* see below */ + } else if (ret == MB_INCOMPLETE) { /* * We can only get here if there is an EOF in the * middle of a character... safest to keep the debris, -- cgit 1.4.1