Skip to content

Commit

Permalink
read -r -d should not ignore -r
Browse files Browse the repository at this point in the history
This bug was previously reported in att#37.
Ksh ignores `-r` when `read -r -d` is run because when
the bit for `D_FLAG` is set, the bit for `R_FLAG` is unset
as a side effect of setting `D_FLAG`. The following set
of commands fails to print a backslash:

$ printf '\\\000' | read -r -d ''
$ echo $REPLY

The fix for this bug is to set `D_FLAG` with `D_FLAG + 1`,
which prevents `R_FLAG` from being unset. This bugfix
has been backported from ksh93v- 2013-10-10-alpha.

src/cmd/ksh93/bltins/read.c:
 - Set `D_FLAG` with `D_FLAG + 1` to prevent the bit for
   `R_FLAG` from being unset.

src/cmd/ksh93/tests/builtins.sh:
 - Add the regression test for `read -r -d` from ksh93v-.
  • Loading branch information
JohnoKing committed Jun 16, 2020
1 parent a9de50b commit 4e07129
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 4 deletions.
5 changes: 5 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ For full details, see the git log at: https://github.com/ksh93/ksh

Any uppercase BUG_* names are modernish shell bug IDs.

2020-06-16:

- Passing the '-d' flag to the read builtin will no longer cause the '-r'
flag to be discarded when 'read -r -d' is run.

2020-06-15:

- The 'source' alias has been converted into a regular built-in command.
Expand Down
6 changes: 3 additions & 3 deletions src/cmd/ksh93/bltins/read.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,8 @@ int b_read(int argc,char *argv[], Shbltin_t *context)
if(opt_info.arg && *opt_info.arg!='\n')
{
char *cp = opt_info.arg;
flags &= ~((1<<D_FLAG)-1);
flags |= (mbchar(cp)<< D_FLAG);
flags &= ((1<<D_FLAG+1)-1);
flags |= (mbchar(cp)<<D_FLAG+1) | (1<<D_FLAG);
}
break;
case 'p':
Expand Down Expand Up @@ -283,7 +283,7 @@ int sh_readline(register Shell_t *shp,char **names, volatile int fd, int flags,s
tty_raw(fd,1);
if(!(flags&(N_FLAG|NN_FLAG)))
{
delim = ((unsigned)flags)>>D_FLAG;
delim = ((unsigned)flags)>>(D_FLAG+1);
ep->e_nttyparm.c_cc[VEOL] = delim;
ep->e_nttyparm.c_lflag |= ISIG;
tty_set(fd,TCSADRAIN,&ep->e_nttyparm);
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/ksh93/include/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@
* David Korn <dgk@research.att.com> *
* *
***********************************************************************/
#define SH_RELEASE "93u+m 2020-06-15"
#define SH_RELEASE "93u+m 2020-06-16"
5 changes: 5 additions & 0 deletions src/cmd/ksh93/tests/builtins.sh
Original file line number Diff line number Diff line change
Expand Up @@ -692,5 +692,10 @@ EOF
PATH=/dev/null
whence -q export) || err_exit '`builtin -d` deletes special builtins'
# ======
# `read -r -d` should not ignore `-r`
printf '\\\000' | read -r -d ''
[[ $REPLY == $'\\' ]] || err_exit "read -r -d '' ignores -r"
# ======
exit $((Errors<125?Errors:125))

0 comments on commit 4e07129

Please sign in to comment.