[git commit master] awk: fix an incorrect casting to string (bug 725). -44 bytes.

Denys Vlasenko vda.linux at googlemail.com
Mon Nov 30 00:15:04 UTC 2009


commit: http://git.busybox.net/busybox/commit/?id=1284774d60ebce68dec6fcaf44a33e928c4c1f82
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 editors/awk.c       |   14 ++++++++------
 testsuite/awk.tests |   17 +++++++++++++++++
 2 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/editors/awk.c b/editors/awk.c
index e987bc8..bc8b0da 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -2424,17 +2424,19 @@ static var *evaluate(node *op, var *res)
 			X.re = as_regex(op1, &sreg);
 			R.i = regexec(X.re, L.s, 0, NULL, 0);
 			if (X.re == &sreg) regfree(X.re);
-			setvar_i(res, (R.i == 0 ? 1 : 0) ^ (opn == '!' ? 1 : 0));
+			setvar_i(res, (R.i == 0) ^ (opn == '!'));
 			break;
 
 		case XC( OC_MOVE ):
 			/* if source is a temporary string, jusk relink it to dest */
-			if (R.v == v1+1 && R.v->string) {
-				res = setvar_p(L.v, R.v->string);
-				R.v->string = NULL;
-			} else {
+//Disabled: if R.v is numeric but happens to have cached R.v->string,
+//then L.v ends up being a string, which is wrong
+//			if (R.v == v1+1 && R.v->string) {
+//				res = setvar_p(L.v, R.v->string);
+//				R.v->string = NULL;
+//			} else {
 				res = copyvar(L.v, R.v);
-			}
+//			}
 			break;
 
 		case XC( OC_TERNARY ):
diff --git a/testsuite/awk.tests b/testsuite/awk.tests
index 2c7642c..7910c88 100755
--- a/testsuite/awk.tests
+++ b/testsuite/awk.tests
@@ -47,4 +47,21 @@ testing "awk NF in BEGIN" \
 	":0::::\n" \
 	"" ""
 
+prg='
+function b(tmp) {
+	tmp = 0;
+	print "" tmp; #this line causes the bug
+	return tmp;
+}
+function c(tmpc) {
+	tmpc = b(); return tmpc;
+}
+BEGIN {
+	print (c() ? "string" : "number");
+}'
+testing "awk string cast (bug 725)" \
+	"awk '$prg'" \
+	"0\nnumber\n" \
+	"" ""
+
 exit $FAILCOUNT
-- 
1.6.3.3



More information about the busybox-cvs mailing list