From fb3ad98f71861c9676c972e00e7c76879ec17e41 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sun, 10 Mar 2013 21:45:04 +0000 Subject: 31141: Tighten NO_CLOBBER restrictions on {fd} syntax to apply only if $fd is exactly an fd and nothing else. --- ChangeLog | 8 +++++++- Src/exec.c | 9 ++++++++- Test/A04redirect.ztst | 11 +++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4c3351517..6f2a0e4f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-03-10 Peter Stephenson + + * 31141: Src/exec.c, Test/A04redirect.ztst: NO_CLOBBER for {fd} + syntax should only apply if $fd is exactly an fd and nothing + else. + 2013-03-10 Mikael Magnusson * 30496: Src/prompt.c: Parse argument to %F and %K as prompt @@ -577,5 +583,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.5816 $ +* $Revision: 1.5817 $ ***************************************************** diff --git a/Src/exec.c b/Src/exec.c index 1ecbc3967..fa148756b 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -1885,7 +1885,14 @@ checkclobberparam(struct redir *f) return 0; } - if (!isset(CLOBBER) && (fd = (int)getintvalue(v)) && + /* + * We can't clobber the value in the parameter if it's + * already an opened file descriptor --- that means it's a decimal + * integer corresponding to an opened file descriptor, + * not merely an expression that evaluates to a file descriptor. + */ + if (!isset(CLOBBER) && (s = getstrvalue(v)) && + (fd = (int)zstrtol(s, &s, 10)) >= 0 && !*s && fd <= max_zsh_fd && fdtable[fd] == FDT_EXTERNAL) { zwarn("can't clobber parameter %s containing file descriptor %d", f->varid, fd); diff --git a/Test/A04redirect.ztst b/Test/A04redirect.ztst index b8086e724..7ad02db3b 100644 --- a/Test/A04redirect.ztst +++ b/Test/A04redirect.ztst @@ -328,6 +328,17 @@ 1q:NO_CLOBBER prevents overwriting parameter with allocated fd ?(eval):4: can't clobber parameter myfd containing file descriptor $myfd + (setopt noclobber + exec {myfd}>logfile2b + print First open >&$myfd + rm -f logfile2b # prevent normal file no_clobberation + myotherfd="${myfd}+0" + exec {myotherfd}>logfile2b + print Overwritten >&$myotherfd) + cat logfile2b +0:NO_CLOBBER doesn't complain about any other expression +>Overwritten + (exec {myfd}>logfile4 echo $myfd exec {myfd}>&- -- cgit 1.4.1