diff options
author | Oliver Kiddle <opk@zsh.org> | 2022-12-17 00:09:37 +0100 |
---|---|---|
committer | Oliver Kiddle <opk@zsh.org> | 2022-12-17 00:37:19 +0100 |
commit | 35a2f155c3b92e67957325e1f49e409546378e3e (patch) | |
tree | 7c4593cf459ae5067627043c7fba15866c48c8c6 /Src/builtin.c | |
parent | 2701ab161df1f259b8292a650a4ea5cebd668d81 (diff) | |
download | zsh-35a2f155c3b92e67957325e1f49e409546378e3e.tar.gz zsh-35a2f155c3b92e67957325e1f49e409546378e3e.tar.xz zsh-35a2f155c3b92e67957325e1f49e409546378e3e.zip |
51214: handle read -d and a delimiter that can't be decoded into a character
Terminate input at the raw byte value of the delimiter. Also document and test the use of an empty string as a way to specify NUL as the delimiter.
Diffstat (limited to 'Src/builtin.c')
-rw-r--r-- | Src/builtin.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/Src/builtin.c b/Src/builtin.c index 951970138..70a950666 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -6282,6 +6282,7 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func)) long izle_timeout = 0; #ifdef MULTIBYTE_SUPPORT wchar_t delim = L'\n', wc; + int rawbyte = 0; mbstate_t mbs; char *laststart; size_t ret; @@ -6412,9 +6413,11 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func)) wi = WEOF; if (wi != WEOF) delim = (wchar_t)wi; - else + else { delim = (wchar_t) (unsigned char) ((delimstr[0] == Meta) ? delimstr[1] ^ 32 : delimstr[0]); + rawbyte = 1; + } #else delim = (unsigned char) ((delimstr[0] == Meta) ? delimstr[1] ^ 32 : delimstr[0]); @@ -6842,7 +6845,7 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func)) break; } *bptr = (char)c; - if (isset(MULTIBYTE)) { + if (isset(MULTIBYTE) && !rawbyte) { ret = mbrtowc(&wc, bptr, 1, &mbs); if (!ret) /* NULL */ ret = 1; |