Hi Herbert, all these three patches from Oleg at
 http://bugs.debian.org/431320
make sense to me, for the 3rd one I did a commit for the Debian package,
attached.

Regards, Gerrit.

----- Forwarded message from Oleg Verych <[EMAIL PROTECTED]> -----

Subject: Bug#431320: dash, test: Arithmetic argument NULL must be handled as 
Not A Number
Reply-To: Oleg Verych <[EMAIL PROTECTED]>, [EMAIL PROTECTED]
Date: Sun, 1 Jul 2007 18:42:56 +0200
From: Oleg Verych <[EMAIL PROTECTED]>
To: Debian Bug Tracking System <[EMAIL PROTECTED]>

Package: dash
Version: 0.5.3-9
Severity: normal
Tags: patch

Please consider attached test cases and patch set (with additional
size/speed optimizations).

Thanks.

-- System Information:
Debian Release: lenny/sid
  APT prefers unstable
  APT policy: (776, 'unstable'), (775, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.18-4-amd64 (SMP w/1 CPU core)
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/dash

Versions of packages dash depends on:
ii  libc6                         2.5-11     GNU C Library: Shared libraries

dash recommends no packages.

-- debconf information:
* dash/sh: true

>From [EMAIL PROTECTED] Sun Jul 01 16:05:29 2007
Subject: [patch 01/03] dash, test: whitespace cleanup (as done by default by 
emacs)
Content-Disposition: inline; 
filename=dash-test-bltin-whitespace-cleanup-by-emacs.patch
Status: RO
Content-Length: 1300
Lines: 62

Some trailing whitespace was killed or tabified.
--
-o--=O`C
 #oo'L O
<___=E M

---
 src/bltin/test.c |   14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

Index: dash-0.5.3/src/bltin/test.c
===================================================================
--- dash-0.5.3.orig/src/bltin/test.c    2005-11-26 04:17:55.000000000 +0100
+++ dash-0.5.3/src/bltin/test.c 2007-07-01 15:16:58.979656750 +0200
@@ -250,7 +250,7 @@
 
        if (t_lex(t_wp[1]), t_wp_op && t_wp_op->op_type == BINOP) {
                return binop();
-       }         
+       }
 
        return strlen(*t_wp) > 0;
 }
@@ -267,7 +267,7 @@
 
        if ((opnd2 = *++t_wp) == (char *)0)
                syntax(op->op_text, "argument expected");
-               
+
        switch (op->op_num) {
        default:
 #ifdef DEBUG
@@ -389,8 +389,8 @@
                return 0;
        while (op->op_text) {
                if (strcmp(s, op->op_text) == 0)
-                       return op->op_type == BINOP &&
-                           (t[0] != ')' || t[1] != '\0'); 
+                       return op->op_type == BINOP &&
+                           (t[0] != ')' || t[1] != '\0');
                op++;
        }
        return 0;
@@ -407,13 +407,13 @@
        r = strtol(s, &p, 10);
 
        if (errno != 0)
-             error("%s: out of range", s);
+               error("%s: out of range", s);
 
        while (isspace((unsigned char)*p))
              p++;
-       
+
        if (*p)
-             error("%s: bad number", s);
+               error("%s: bad number", s);
 
        return (int) r;
 }

-- 

>From [EMAIL PROTECTED] Sun Jul 01 16:05:29 2007
Subject: [patch 02/03] dash, test: little size and speed optimizations
Content-Disposition: inline; filename=dash-test-bltin-optimize-size.patch
Status: O
Content-Length: 1831
Lines: 71

* Speed up (libc=glibc):

deen:debian/src/dash-0.5.3# echo $(((7853+8631+7529+9777+9161+7552)/6))
8417,8250 # this patch
deen:/mnt/work/debian/src/dash-0.5.3# echo 
$(((9553+7789+9450+9925+7595+9590)/6))
8983 # short
deen:debian/src/dash-0.5.3# echo $(( (9655+7853+9733+7826+9618+10053)/6 ))
9123 # '[' ']'
deen:debian/src/dash-0.5.3#

deen:debian/src/dash-0.5.3# echo $(((9231+9423+9365+9650+8883+8291)/6))
9140 # unpatched
deen:debian/src/dash-0.5.3#

* Size down:

[EMAIL PROTECTED]:/mnt/debian/src/dash-0.5.3$ size src/test.o # this patchset
   text    data     bss     dec     hex filename
   4142       0      16    4158    103e src/test.o

[EMAIL PROTECTED]:/mnt/debian/src/dash-0.5.3$ size src/test.o
   text    data     bss     dec     hex filename
   4209       0      16    4225    1081 src/test.o
[EMAIL PROTECTED]:/mnt/debian/src/dash-0.5.3$
--
-o--=O`C
 #oo'L O
<___=E M

---
 src/bltin/test.c |   12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

Index: dash-0.5.3/src/bltin/test.c
===================================================================
--- dash-0.5.3.orig/src/bltin/test.c    2007-07-01 07:05:08.884380750 +0200
+++ dash-0.5.3/src/bltin/test.c 2007-07-01 15:16:54.715390250 +0200
@@ -157,8 +157,8 @@
 {
        int res;
 
-       if (strcmp(argv[0], "[") == 0) {
-               if (strcmp(argv[--argc], "]"))
+       if (*argv[0] == '[') {
+               if (*argv[--argc] != ']')
                        error("missing ]");
                argv[argc] = NULL;
        }
@@ -259,16 +259,16 @@
 binop(void)
 {
        const char *opnd1, *opnd2;
-       struct t_op const *op;
+       short op_num;
 
        opnd1 = *t_wp;
        (void) t_lex(*++t_wp);
-       op = t_wp_op;
 
        if ((opnd2 = *++t_wp) == (char *)0)
-               syntax(op->op_text, "argument expected");
+               syntax(t_wp_op->op_text, "argument expected");
 
-       switch (op->op_num) {
+       op_num = t_wp_op->op_num;
+       switch (op_num) {
        default:
 #ifdef DEBUG
                abort();

-- 

>From [EMAIL PROTECTED] Sun Jul 01 16:05:29 2007
Subject: [patch 03/03] dash, test: recognize NULL argument as not a number
Content-Disposition: inline; 
filename=dash-test-bltin-integer-null-arg-check-fix.patch
Status: O
Content-Length: 1605
Lines: 64

* NULL as a number argument:

[EMAIL PROTECTED]:/mnt/debian/src/dash-0.5.3$ time src/dash tst-01.sh
test: 20: `': bad number
`' eq 0: 2  must be >1, Not A Number
test: 20: `': bad number
`' ne 0: 2  must be >1, Not A Number
test: 20: `': bad number
`' gt 0: 2  must be >1, Not A Number
test: 20: `': bad number
`' ge 0: 2  must be >1, Not A Number
test: 20: `': bad number
`' lt 0: 2  must be >1, Not A Number
test: 20: `': bad number
`' le 0: 2  must be >1, Not A Number
/usr/bin/test: invalid integer `'
`' eq 0: 2  must be >1, Not A Number
/usr/bin/test: invalid integer `'
`' ne 0: 2  must be >1, Not A Number
/usr/bin/test: invalid integer `'
`' gt 0: 2  must be >1, Not A Number
/usr/bin/test: invalid integer `'
`' ge 0: 2  must be >1, Not A Number
/usr/bin/test: invalid integer `'
`' lt 0: 2  must be >1, Not A Number
/usr/bin/test: invalid integer `'
`' le 0: 2  must be >1, Not A Number
--
-o--=O`C
 #oo'L O
<___=E M

---
 src/bltin/test.c |   15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

Index: dash-0.5.3/src/bltin/test.c
===================================================================
--- dash-0.5.3.orig/src/bltin/test.c    2007-07-01 07:05:08.932383750 +0200
+++ dash-0.5.3/src/bltin/test.c 2007-07-01 15:16:48.579006750 +0200
@@ -409,13 +409,14 @@
        if (errno != 0)
                error("%s: out of range", s);
 
-       while (isspace((unsigned char)*p))
-             p++;
-
-       if (*p)
-               error("%s: bad number", s);
-
-       return (int) r;
+       if (p != s) {
+               while (isspace((unsigned char)*p))
+                       p++;
+
+               if (!*p)
+                       return (int) r;
+       }
+       error("`%s': bad number", s);
 }
 
 static int

-- 


#!/usr/bin/printf This not executable script%c\n

test_arithm() {
    for aop in eq ne gt ge lt le
    do  "$1" 0 -$aop "$NOTHING"
        echo "\`' $aop 0:" $? " must be >1, Not A Number"
    done
}
# opengroup.org/onlinepubs/000095399/utilites/test.html (nothing about long):
test_arithm test
test_arithm /usr/bin/test

# shend

#!/usr/bin/printf This not executable script%c\n

i=512512
while test $i != 0
do
i=$(($i-1))
test 214748364 -lt 1214748364
done

# shend


----- End forwarded message -----
>From c989170eb01b503d5abc005d3312884598397d7a Mon Sep 17 00:00:00 2001
From: Gerrit Pape <[EMAIL PROTECTED]>
Date: Wed, 19 Sep 2007 09:04:31 +0000
Subject: [PATCH] dash, test: handle arithmetic argument NULL as Not A Number

The test builtin is silent when using '' as arithmetic argument, but
prints a diagnostic error message when using e.g. 'foo'

 $ dash -c 'test 1 -eq "foo"'
 test: 1: foo: bad number
 $ dash -c 'test 1 -eq ""'
 $

This commit makes dash print the message in both cases.

Patch is from Oleg Verych <[EMAIL PROTECTED]>, posted through
 http://bugs.debian.org/431320
---
 src/bltin/test.c |   15 ++++++++-------
 1 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/bltin/test.c b/src/bltin/test.c
index f16c819..6bc22fd 100644
--- a/src/bltin/test.c
+++ b/src/bltin/test.c
@@ -409,13 +409,14 @@ getn(const char *s)
 	if (errno != 0)
 	      error("%s: out of range", s);
 
-	while (isspace((unsigned char)*p))
-	      p++;
-	
-	if (*p)
-	      error("%s: bad number", s);
-
-	return (int) r;
+       if (p != s) {
+               while (isspace((unsigned char)*p))
+                       p++;
+
+               if (!*p)
+                       return (int) r;
+       }
+       error("`%s': bad number", s);
 }
 
 static int
-- 
1.5.3.1

Reply via email to