1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-02-15 04:32:24 +00:00

read -S now correctly handles nested double quotes

Prior to this bugfix, the following set of commands would
fail to print two double quotes:

IFS=',' read -S a b c <<<'foo,"""title"" data",bar'
echo $b

This fix is from ksh93v- 2013-10-10-alpha, although it has
been revised to use stakputc to put the required double quote
into the buffer for consistency with the ksh93u+ codebase.

src/cmd/ksh93/bltins/read.c:
 - When handling nested double quotes, put the required double
   quote in read's buffer with stakputc.

src/cmd/ksh93/tests/builtins.sh:
 - Add the regression test for `read -S` from ksh93v-.

src/cmd/ksh93/sh.1:
 - Fix a minor formatting error to highlight '-S' in the ksh(1)
   man page.
This commit is contained in:
Johnothan King 2020-06-14 09:28:22 -07:00
parent 5498d9ec25
commit af0bd6ad70
5 changed files with 21 additions and 3 deletions

4
NEWS
View file

@ -3,6 +3,10 @@ For full details, see the git log at: https://github.com/ksh93/ksh
Any uppercase BUG_* names are modernish shell bug IDs. Any uppercase BUG_* names are modernish shell bug IDs.
2020-06-14:
- 'read -S' is now able to correctly handle strings with double quotes
nested inside of double quotes.
2020-06-13: 2020-06-13:
- Fixed a timezone name determination bug on FreeBSD that caused the - Fixed a timezone name determination bug on FreeBSD that caused the

View file

@ -566,13 +566,21 @@ int sh_readline(register Shell_t *shp,char **names, volatile int fd, int flags,s
#endif /*SHOPT_MULTIBYTE */ #endif /*SHOPT_MULTIBYTE */
case S_QUOTE: case S_QUOTE:
c = shp->ifstable[*cp++]; c = shp->ifstable[*cp++];
inquote = !inquote; if(inquote && c==S_QUOTE)
c = -1;
else
inquote = !inquote;
if(val) if(val)
{ {
stakputs(val); stakputs(val);
use_stak = 1; use_stak = 1;
*val = 0; *val = 0;
} }
if(c==-1)
{
stakputc('"');
c = shp->ifstable[*cp++];
}
continue; continue;
case S_ESC: case S_ESC:
/* process escape character */ /* process escape character */

View file

@ -17,4 +17,4 @@
* David Korn <dgk@research.att.com> * * David Korn <dgk@research.att.com> *
* * * *
***********************************************************************/ ***********************************************************************/
#define SH_RELEASE "93u+m 2020-06-11" #define SH_RELEASE "93u+m 2020-06-14"

View file

@ -6679,7 +6679,8 @@ option causes the variable
.I vname\^ .I vname\^
to be read as a compound variable. Blanks will be ignored when to be read as a compound variable. Blanks will be ignored when
finding the beginning open parenthesis. finding the beginning open parenthesis.
The \-S The
.B \-S
option causes the line to be treated like a record in a option causes the line to be treated like a record in a
.B .csv .B .csv
format file so that double quotes can be used to allow the delimiter format file so that double quotes can be used to allow the delimiter

View file

@ -692,5 +692,10 @@ EOF
PATH=/dev/null PATH=/dev/null
whence -q export) || err_exit '`builtin -d` deletes special builtins' whence -q export) || err_exit '`builtin -d` deletes special builtins'
# ======
# `read -S` should handle double quotes correctly
IFS=',' read -S a b c <<<'foo,"""title"" data",bar'
[[ $b == '"title" data' ]] || err_exit '"" inside "" not handled correctly with read -S'
# ====== # ======
exit $((Errors<125?Errors:125)) exit $((Errors<125?Errors:125))