Blob Blame History Raw
--- gawk-3.1.5/node.c.num2str	2005-07-26 20:07:43.000000000 +0200
+++ gawk-3.1.5/node.c	2005-12-22 19:41:55.000000000 +0100
@@ -151,6 +151,7 @@
 	register char *sp = buf;
 	double val;
 	char *orig, *trans, save;
+	register long num;
 
 	if (! do_traditional && (s->flags & INTLSTR) != 0) {
 		save = s->stptr[s->stlen];
@@ -163,9 +164,12 @@
 		return tmp_string(trans, strlen(trans));
 	}
 
-	/* not an integral value, or out of range */
-	if ((val = double_to_int(s->numbr)) != s->numbr
-	    || val < LONG_MIN || val > LONG_MAX) {
+	/* conversion to long overflows, or out of range, or not integral */
+	val = double_to_int(s->numbr);
+	num = (long) val;
+	if (   (s->numbr > 0 && num < 0)
+	    || (s->numbr < 0 && num > 0)
+	    || val < LONG_MIN || val > LONG_MAX || val != s->numbr) {
 		/*
 		 * Once upon a time, if GFMT_WORKAROUND wasn't defined,
 		 * we just blindly did this:
@@ -199,9 +203,7 @@
 
 		goto no_malloc;
 	} else {
-		/* integral value */
-	        /* force conversion to long only once */
-		register long num = (long) val;
+		/* integral value, in range, too! */
 		if (num < NVAL && num >= 0) {
 			sp = (char *) values[num];
 			s->stlen = 1;