diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-11-30 01:15:04 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-11-30 01:15:04 +0100 |
commit | 1284774d60ebce68dec6fcaf44a33e928c4c1f82 (patch) | |
tree | 165bc1ec980eca2d30b04d7939bafbf7667fc1b8 | |
parent | cdeda16ee4acb78569598e848a491ad595af3abb (diff) | |
download | busybox-w32-1284774d60ebce68dec6fcaf44a33e928c4c1f82.tar.gz busybox-w32-1284774d60ebce68dec6fcaf44a33e928c4c1f82.tar.bz2 busybox-w32-1284774d60ebce68dec6fcaf44a33e928c4c1f82.zip |
awk: fix an incorrect casting to string (bug 725). -44 bytes.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | editors/awk.c | 14 | ||||
-rwxr-xr-x | testsuite/awk.tests | 17 |
2 files changed, 25 insertions, 6 deletions
diff --git a/editors/awk.c b/editors/awk.c index e987bc868..bc8b0dad1 100644 --- a/editors/awk.c +++ b/editors/awk.c | |||
@@ -2424,17 +2424,19 @@ static var *evaluate(node *op, var *res) | |||
2424 | X.re = as_regex(op1, &sreg); | 2424 | X.re = as_regex(op1, &sreg); |
2425 | R.i = regexec(X.re, L.s, 0, NULL, 0); | 2425 | R.i = regexec(X.re, L.s, 0, NULL, 0); |
2426 | if (X.re == &sreg) regfree(X.re); | 2426 | if (X.re == &sreg) regfree(X.re); |
2427 | setvar_i(res, (R.i == 0 ? 1 : 0) ^ (opn == '!' ? 1 : 0)); | 2427 | setvar_i(res, (R.i == 0) ^ (opn == '!')); |
2428 | break; | 2428 | break; |
2429 | 2429 | ||
2430 | case XC( OC_MOVE ): | 2430 | case XC( OC_MOVE ): |
2431 | /* if source is a temporary string, jusk relink it to dest */ | 2431 | /* if source is a temporary string, jusk relink it to dest */ |
2432 | if (R.v == v1+1 && R.v->string) { | 2432 | //Disabled: if R.v is numeric but happens to have cached R.v->string, |
2433 | res = setvar_p(L.v, R.v->string); | 2433 | //then L.v ends up being a string, which is wrong |
2434 | R.v->string = NULL; | 2434 | // if (R.v == v1+1 && R.v->string) { |
2435 | } else { | 2435 | // res = setvar_p(L.v, R.v->string); |
2436 | // R.v->string = NULL; | ||
2437 | // } else { | ||
2436 | res = copyvar(L.v, R.v); | 2438 | res = copyvar(L.v, R.v); |
2437 | } | 2439 | // } |
2438 | break; | 2440 | break; |
2439 | 2441 | ||
2440 | case XC( OC_TERNARY ): | 2442 | case XC( OC_TERNARY ): |
diff --git a/testsuite/awk.tests b/testsuite/awk.tests index 2c7642ce0..7910c8875 100755 --- a/testsuite/awk.tests +++ b/testsuite/awk.tests | |||
@@ -47,4 +47,21 @@ testing "awk NF in BEGIN" \ | |||
47 | ":0::::\n" \ | 47 | ":0::::\n" \ |
48 | "" "" | 48 | "" "" |
49 | 49 | ||
50 | prg=' | ||
51 | function b(tmp) { | ||
52 | tmp = 0; | ||
53 | print "" tmp; #this line causes the bug | ||
54 | return tmp; | ||
55 | } | ||
56 | function c(tmpc) { | ||
57 | tmpc = b(); return tmpc; | ||
58 | } | ||
59 | BEGIN { | ||
60 | print (c() ? "string" : "number"); | ||
61 | }' | ||
62 | testing "awk string cast (bug 725)" \ | ||
63 | "awk '$prg'" \ | ||
64 | "0\nnumber\n" \ | ||
65 | "" "" | ||
66 | |||
50 | exit $FAILCOUNT | 67 | exit $FAILCOUNT |