tags 276964 + patch
quit
On Tue, Feb 22, 2005 at 02:05:23PM +0100, Jeroen van Wolffelaar wrote:
> On Tue, Feb 22, 2005 at 01:43:17AM +0100, Jeroen van Wolffelaar wrote:
> > | elif ! eval $mysqlcmd -f $dbname -e "\"$statement\"" >/dev/null 2>&1 ;
> > then
> > | log="${log}Executing command to mysql."
> > | (...)
> > | else
> > | status=nothing
> > | fi
> >
> > This should, even though set -e is enabled, NOT result in abortion of shell
> > execution.
>
> Ok, this is a dash bug, #268944.
>
> Because /bin/sh claims to be a replacement /bin/sh when installing, this
> is IMHO a critical bug -- it breaks unrelated software.
Yes, I agree.
Hi Herbert, it turns out bug #268944 'sh: wrong errexit with eval'
breaks at least one other package's postinst, raising its severity. See
below for a patch that I think fixes the problem.
$ dash -exc 'eval false || true; false; true'
+ eval false
+ false
$ ./build-tmp/src/dash -exc 'eval false || true; false; true'
+ eval false
+ false
+ true
+ false
$ dash -exc 'fn() { false; }; fn || true; false true'
+ fn
+ false
+ true
+ false true
$ ./build-tmp/src/dash -exc 'fn() { false; }; fn || true; false true'
+ fn
+ false
+ true
+ false true
$ echo false >t
$ dash -exc '. ./t || true; false; true'
+ . ./t
+ false
$ ./build-tmp/src/dash -exc '. ./t || true; false; true'
+ . ./t
+ false
+ true
+ false
$
Thanks, Gerrit.
Index: src/eval.c
===================================================================
RCS file: /cvs/dash/src/eval.c,v
retrieving revision 1.1
diff -u -r1.1 eval.c
--- src/eval.c 3 Jul 2004 12:52:54 -0000 1.1
+++ src/eval.c 22 Feb 2005 19:55:47 -0000
@@ -87,6 +87,7 @@
STATIC int skipcount; /* number of levels to skip */
MKINIT int loopnest; /* current loop nesting level */
int funcnest; /* depth of function calls */
+int ev_tested;
char *commandname;
@@ -134,6 +135,7 @@
evalskip = 0;
loopnest = 0;
funcnest = 0;
+ ev_tested = 0;
}
#endif
@@ -245,7 +247,13 @@
evalcommand(n, flags, (struct backcmd *)NULL);
break;
#else
+ ev_tested += (flags & EV_TESTED)?1:0;
evalfn = evalcommand;
+ if (eflag && !(flags & EV_TESTED))
+ checkexit = ~0;
+ evalfn(n, flags);
+ ev_tested -= (flags & EV_TESTED)?1:0;
+ break;
checkexit:
if (eflag && !(flags & EV_TESTED))
checkexit = ~0;
@@ -323,7 +331,7 @@
if (pendingsigs)
dotrap();
if (flags & EV_EXIT || checkexit & exitstatus)
- exraise(EXEXIT);
+ if (! ev_tested) exraise(EXEXIT);
}
Index: src/eval.h
===================================================================
RCS file: /cvs/dash/src/eval.h,v
retrieving revision 1.1
diff -u -r1.1 eval.h
--- src/eval.h 3 Jul 2004 12:52:54 -0000 1.1
+++ src/eval.h 22 Feb 2005 19:55:47 -0000
@@ -60,6 +60,7 @@
#define in_function() funcnest
extern int funcnest;
extern int evalskip;
+extern int ev_tested;
/* reasons for skipping commands (see comment on breakcmd routine) */
#define SKIPBREAK 1