From ed5d0535140693dbfa3f0e6d8bf844dfc2d4943b Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Fri, 19 Feb 2010 12:45:35 +0000 Subject: 27722: bad error reporting and checking in conditions --- ChangeLog | 6 +++++- Src/cond.c | 21 ++++++++++++++------- Test/C02cond.ztst | 8 ++++++++ Test/V01zmodload.ztst | 2 +- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 41a4ecc2d..74948d827 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2010-02-19 Peter Stephenson + * 27722: Src/cond.c, Test/C02cond.zts, Test/V01zmodload.ztst: Error + reporting for failed conditions was badly handled; one + piece of code didn't test for a '-' prefix. + * 27723: Src/builtin.c, Test/D02glob.ztst: eval shouldn't modify non-zero return statuses. @@ -12779,5 +12783,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.4906 $ +* $Revision: 1.4907 $ ***************************************************** diff --git a/Src/cond.c b/Src/cond.c index 2d073fc46..b911bfb33 100644 --- a/Src/cond.c +++ b/Src/cond.c @@ -104,7 +104,7 @@ evalcond(Estate state, char *fromtest) case COND_MODI: { Conddef cd; - char *name = overridename; + char *name = overridename, *errname; char **strs; int l = WC_COND_SKIP(code); @@ -122,10 +122,17 @@ evalcond(Estate state, char *fromtest) strs = arrdup(sbuf); l = 2; } - if ((cd = getconddef((ctype == COND_MODI), name + 1, 1))) { + if (name && name[0] == '-') + errname = name; + else if (strs[0] && *strs[0] == '-') + errname = strs[0]; + else + errname = ""; + if (name && name[0] == '-' && + (cd = getconddef((ctype == COND_MODI), name + 1, 1))) { if (ctype == COND_MOD && (l < cd->min || (cd->max >= 0 && l > cd->max))) { - zwarnnam(fromtest, "unknown condition: -%s", name); + zwarnnam(fromtest, "unknown condition: %s", name); return 2; } if (tracingcond) @@ -151,8 +158,8 @@ evalcond(Estate state, char *fromtest) if (name && name[0] == '-' && (cd = getconddef(0, name + 1, 1))) { if (l < cd->min || (cd->max >= 0 && l > cd->max)) { - zwarnnam(fromtest, "unknown condition: -%s", - name); + zwarnnam(fromtest, "unknown condition: %s", + errname); return 2; } if (tracingcond) @@ -160,8 +167,8 @@ evalcond(Estate state, char *fromtest) return !cd->handler(strs, cd->condid); } else { zwarnnam(fromtest, - "unknown condition: -%s", - name ? name : ""); + "unknown condition: %s", + errname); } } /* module not found, error */ diff --git a/Test/C02cond.ztst b/Test/C02cond.ztst index a824709d3..2d4204038 100644 --- a/Test/C02cond.ztst +++ b/Test/C02cond.ztst @@ -285,6 +285,14 @@ F:Failures in these cases do not indicate a problem in the shell. 0:MATCH, MBEGIN, MEND, match, mbegin, mend >OK + [[ -fail badly ]] +2:Error message for unknown prefix condition +?(eval):1: unknown condition: -fail + + [[ really -fail badly ]] +2:Error message for unknown infix condition +?(eval):1: unknown condition: -fail + %clean # This works around a bug in rm -f in some versions of Cygwin chmod 644 unmodish diff --git a/Test/V01zmodload.ztst b/Test/V01zmodload.ztst index d5e3605ac..25eb81f01 100644 --- a/Test/V01zmodload.ztst +++ b/Test/V01zmodload.ztst @@ -151,7 +151,7 @@ print "Shouldn't get here.") 2:Failed condition autoload ?(eval):3: module `zsh/parameter' has no such feature: `c:fail': autoload cancelled -?(eval):3: unknown condition: -foo +?(eval):3: unknown condition: -fail (zmodload -u zsh/parameter zmodload -aF zsh/parameter f:fail -- cgit 1.4.1