Module Name:    src
Committed By:   christos
Date:           Thu May  6 16:15:33 UTC 2021

Modified Files:
        src/lib/libc/gdtoa: dtoa.c gdtoa.c strtoIg.c strtod.c strtodg.c

Log Message:
PR/56148: Andreas Gustafsson: lib/libc/stdio/t_printf:snprintf_float test
randomly fails.
Add checks to all places where lshift is called because it can return NULL


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/lib/libc/gdtoa/dtoa.c
cvs rdiff -u -r1.7 -r1.8 src/lib/libc/gdtoa/gdtoa.c
cvs rdiff -u -r1.4 -r1.5 src/lib/libc/gdtoa/strtoIg.c
cvs rdiff -u -r1.17 -r1.18 src/lib/libc/gdtoa/strtod.c
cvs rdiff -u -r1.12 -r1.13 src/lib/libc/gdtoa/strtodg.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/gdtoa/dtoa.c
diff -u src/lib/libc/gdtoa/dtoa.c:1.10 src/lib/libc/gdtoa/dtoa.c:1.11
--- src/lib/libc/gdtoa/dtoa.c:1.10	Wed May 16 13:48:59 2012
+++ src/lib/libc/gdtoa/dtoa.c	Thu May  6 12:15:33 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: dtoa.c,v 1.10 2012/05/16 17:48:59 alnsn Exp $ */
+/* $NetBSD: dtoa.c,v 1.11 2021/05/06 16:15:33 christos Exp $ */
 
 /****************************************************************
 
@@ -787,6 +787,8 @@ dtoa
 	  }
 #endif
 	b = lshift(b, 1);
+	if (b == NULL)
+		return NULL;
 	j = cmp(b, S);
 #ifdef ROUND_BIASED
 	if (j >= 0)

Index: src/lib/libc/gdtoa/gdtoa.c
diff -u src/lib/libc/gdtoa/gdtoa.c:1.7 src/lib/libc/gdtoa/gdtoa.c:1.8
--- src/lib/libc/gdtoa/gdtoa.c:1.7	Wed Jul 31 22:27:43 2019
+++ src/lib/libc/gdtoa/gdtoa.c	Thu May  6 12:15:33 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: gdtoa.c,v 1.7 2019/08/01 02:27:43 riastradh Exp $ */
+/* $NetBSD: gdtoa.c,v 1.8 2021/05/06 16:15:33 christos Exp $ */
 
 /****************************************************************
 
@@ -601,10 +601,16 @@ gdtoa
 	 */
 	i = ((s5 ? hi0bits(S->x[S->wds-1]) : ULbits - 1) - s2 - 4) & kmask;
 	m2 += i;
-	if ((b2 += i) > 0)
+	if ((b2 += i) > 0) {
 		b = lshift(b, b2);
-	if ((s2 += i) > 0)
+		if (b == NULL)
+			return NULL;
+		}
+	if ((s2 += i) > 0) {
 		S = lshift(S, s2);
+		if (S == NULL)
+			return NULL;
+		}
 	if (k_check) {
 		if (cmp(b,S) < 0) {
 			k--;

Index: src/lib/libc/gdtoa/strtoIg.c
diff -u src/lib/libc/gdtoa/strtoIg.c:1.4 src/lib/libc/gdtoa/strtoIg.c:1.5
--- src/lib/libc/gdtoa/strtoIg.c:1.4	Wed Jul 31 22:27:43 2019
+++ src/lib/libc/gdtoa/strtoIg.c	Thu May  6 12:15:33 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: strtoIg.c,v 1.4 2019/08/01 02:27:43 riastradh Exp $ */
+/* $NetBSD: strtoIg.c,v 1.5 2021/05/06 16:15:33 christos Exp $ */
 
 /****************************************************************
 
@@ -119,6 +119,8 @@ strtoIg(CONST char *s00, char **se, CONS
 				}
 			else {
 				b1 = lshift(b1, 1);
+				if (b1 == NULL)
+					return STRTOG_NoMemory;
 				b1->x[0] |= 1;
 				--e1;
 				}

Index: src/lib/libc/gdtoa/strtod.c
diff -u src/lib/libc/gdtoa/strtod.c:1.17 src/lib/libc/gdtoa/strtod.c:1.18
--- src/lib/libc/gdtoa/strtod.c:1.17	Fri Sep 18 10:19:34 2020
+++ src/lib/libc/gdtoa/strtod.c	Thu May  6 12:15:33 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: strtod.c,v 1.17 2020/09/18 14:19:34 christos Exp $ */
+/* $NetBSD: strtod.c,v 1.18 2021/05/06 16:15:33 christos Exp $ */
 
 /****************************************************************
 
@@ -712,6 +712,8 @@ _int_strtod_l(CONST char *s00, char **se
 #endif
 						  {
 						  delta = lshift(delta,Log2P);
+						  if (delta == NULL)
+							goto ovfl;
 						  if (cmp(delta, bs) <= 0)
 							dval(&adj) = -0.5;
 						  }
@@ -804,6 +806,8 @@ _int_strtod_l(CONST char *s00, char **se
 				break;
 				}
 			delta = lshift(delta,Log2P);
+			if (delta == NULL)
+				goto ovfl;
 			if (cmp(delta, bs) > 0)
 				goto drop_down;
 			break;

Index: src/lib/libc/gdtoa/strtodg.c
diff -u src/lib/libc/gdtoa/strtodg.c:1.12 src/lib/libc/gdtoa/strtodg.c:1.13
--- src/lib/libc/gdtoa/strtodg.c:1.12	Fri Apr 19 06:41:53 2013
+++ src/lib/libc/gdtoa/strtodg.c	Thu May  6 12:15:33 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: strtodg.c,v 1.12 2013/04/19 10:41:53 joerg Exp $ */
+/* $NetBSD: strtodg.c,v 1.13 2021/05/06 16:15:33 christos Exp $ */
 
 /****************************************************************
 
@@ -248,8 +248,11 @@ rvOK
 				}
 			}
 		}
-	else if (bdif < 0)
+	else if (bdif < 0) {
 		b = lshift(b, -bdif);
+		if (b == NULL)
+			return STRTOG_NoMemory;
+		}
 	if (e < fpi->emin) {
 		k = fpi->emin - e;
 		e = fpi->emin;
@@ -679,6 +682,8 @@ strtodg(CONST char *s00, char **se, CONS
 		j = rve - emin;
 		if (j > 0) {
 			rvb = lshift(rvb, j);
+			if (rvb == NULL)
+				return STRTOG_NoMemory;
 			rvbits += j;
 			}
 		else if (j < 0) {
@@ -950,8 +955,11 @@ strtodg(CONST char *s00, char **se, CONS
 			return STRTOG_NoMemory;
 		if (abe < 0)
 			rshift(ab, -abe);
-		else if (abe > 0)
+		else if (abe > 0) {
 			ab = lshift(ab, abe);
+			if (ab == NULL)
+				return STRTOG_NoMemory;
+			}
 		rvb0 = rvb;
 		if (asub) {
 			/* rv -= adj; */
@@ -1027,8 +1035,11 @@ strtodg(CONST char *s00, char **se, CONS
 		Bfree(delta);
 		}
 	if (!denorm && (j = nbits - rvbits)) {
-		if (j > 0)
+		if (j > 0) {
 			rvb = lshift(rvb, j);
+			if (rvb == NULL)
+				return STRTOG_NoMemory;
+			}
 		else
 			rshift(rvb, -j);
 		rve -= j;

Reply via email to