Module Name:    othersrc
Committed By:   lukem
Date:           Tue Jan 29 08:25:50 UTC 2019

Modified Files:
        othersrc/libexec/tnftpd/libnetbsd: strsuftollx.c

Log Message:
sync to NetBSD strsuftoll.c 1.9

Update from NetBSD src/lib/libc/stdlib/strsuftoll.c 1.1 to 1.9.
Notable changes:
- Minimize changes from upstream NetBSD source
- 1.5: print max rather than min when number parsed is greater than max.
- 1.6: explicitly use base 10, to match comments and dd
- 1.9: Put a recursion limit to avoid DoS attacks (Maksymilian Arciemowicz).


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 othersrc/libexec/tnftpd/libnetbsd/strsuftollx.c

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

Modified files:

Index: othersrc/libexec/tnftpd/libnetbsd/strsuftollx.c
diff -u othersrc/libexec/tnftpd/libnetbsd/strsuftollx.c:1.5 othersrc/libexec/tnftpd/libnetbsd/strsuftollx.c:1.6
--- othersrc/libexec/tnftpd/libnetbsd/strsuftollx.c:1.5	Sun Sep 21 16:35:25 2008
+++ othersrc/libexec/tnftpd/libnetbsd/strsuftollx.c	Tue Jan 29 08:25:50 2019
@@ -1,8 +1,8 @@
-/* $NetBSD: strsuftollx.c,v 1.5 2008/09/21 16:35:25 lukem Exp $ */
-/* from NetBSD: strsuftoll.c,v 1.1 2002/11/29 12:58:17 lukem Exp */
+/* $NetBSD: strsuftollx.c,v 1.6 2019/01/29 08:25:50 lukem Exp $ */
+/* from NetBSD: strsuftoll.c,v 1.9 2011/10/22 22:08:47 christos Exp */
 
 /*-
- * Copyright (c) 2001-2002 The NetBSD Foundation, Inc.
+ * Copyright (c) 2001-2002,2004 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -64,34 +64,110 @@
 
 #include "tnftpd.h"
 
+#if 0
+
+#if HAVE_NBTOOL_CONFIG_H
+#include "nbtool_config.h"
+#endif
+
+#include <sys/cdefs.h>
+
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: strsuftollx.c,v 1.6 2019/01/29 08:25:50 lukem Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+#ifdef _LIBC
+#include "namespace.h"
+#endif
+
+#endif
+
+#if !HAVE_STRSUFTOLL
+
+#if 0
+
+#include <sys/types.h>
+#include <sys/time.h>
+
+#include <assert.h>
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _LIBC
+# ifdef __weak_alias
+__weak_alias(strsuftoll, _strsuftoll)
+__weak_alias(strsuftollx, _strsuftollx)
+# endif
+#endif /* LIBC */
+
+#endif
+
 /*
  * Convert an expression of the following forms to a (u)int64_t.
  * 	1) A positive decimal number.
  *	2) A positive decimal number followed by a b (mult by 512).
  *	3) A positive decimal number followed by a k (mult by 1024).
  *	4) A positive decimal number followed by a m (mult by 1048576).
- *	5) A positive decimal number followed by a w (mult by sizeof int)
- *	6) Two or more positive decimal numbers (with/without k,b or w).
+ *	5) A positive decimal number followed by a g (mult by 1073741824).
+ *	6) A positive decimal number followed by a t (mult by 1099511627776).
+ *	7) A positive decimal number followed by a w (mult by sizeof int)
+ *	8) Two or more positive decimal numbers (with/without k,b or w).
  *	   separated by x (also * for backwards compatibility), specifying
  *	   the product of the indicated values.
- * Returns the result upon successful conversion, or returns with 0
- * and sets ebuf to an appropriate error message.
+ * Returns the result upon successful conversion, or exits with an
+ * appropriate error.
+ * 
  */
+
+#if 0
+
 /* LONGLONG */
 long long
-strsuftollx(const char *desc, const char *val,
-    long long min, long long max, char *ebuf, size_t ebuflen)
+strsuftoll(const char *desc, const char *val,
+    long long min, long long max)
+{
+	long long result;
+	char	errbuf[100];
+
+	result = strsuftollx(desc, val, min, max, errbuf, sizeof(errbuf));
+	if (*errbuf != '\0')
+		errx(EXIT_FAILURE, "%s", errbuf);
+	return result;
+}
+
+#endif
+
+/*
+ * As strsuftoll(), but returns the error message into the provided buffer
+ * rather than exiting with it.
+ */
+/* LONGLONG */
+static long long
+__strsuftollx(const char *desc, const char *val,
+    long long min, long long max, char *ebuf, size_t ebuflen, size_t depth)
 {
 	long long num, t;
 	char	*expr;
 
-	errno = 0;
-	ebuf[0] = '\0';
+	_DIAGASSERT(desc != NULL);
+	_DIAGASSERT(val != NULL);
+	_DIAGASSERT(ebuf != NULL);
+
+	if (depth > 16) {
+		snprintf(ebuf, ebuflen, "%s: Recursion limit exceeded", desc);
+		return 0;
+	}
 
 	while (isspace((unsigned char)*val))	/* Skip leading space */
 		val++;
 
-	num = strtoll(val, &expr, 0);
+	errno = 0;
+	num = strtoll(val, &expr, 10);
 	if (errno == ERANGE)
 		goto erange;			/* Overflow */
 
@@ -108,28 +184,28 @@ strsuftollx(const char *desc, const char
 		break;
 	case 'k':
 		t = num;
-		num *= 1024;			/* 1 kilobyte */
+		num *= 1024;			/* 1 kibibyte */
 		if (t > num)
 			goto erange;
 		++expr;
 		break;
 	case 'm':
 		t = num;
-		num *= 1048576;			/* 1 megabyte */
+		num *= 1048576;			/* 1 mebibyte */
 		if (t > num)
 			goto erange;
 		++expr;
 		break;
 	case 'g':
 		t = num;
-		num *= 1073741824;		/* 1 gigabyte */
+		num *= 1073741824;		/* 1 gibibyte */
 		if (t > num)
 			goto erange;
 		++expr;
 		break;
 	case 't':
 		t = num;
-		num *= 1099511627776LL;		/* 1 terabyte */
+		num *= 1099511627776LL;		/* 1 tebibyte */
 		if (t > num)
 			goto erange;
 		++expr;
@@ -149,34 +225,42 @@ strsuftollx(const char *desc, const char
 	case '*':				/* Backward compatible */
 	case 'x':
 		t = num;
-		num *= strsuftollx(desc, expr + 1, min, max, ebuf, ebuflen);
+		num *= __strsuftollx(desc, expr + 1, min, max, ebuf, ebuflen,
+			depth + 1);
 		if (*ebuf != '\0')
-			return (0);
+			return 0;
 		if (t > num) {
  erange:	 	
-			snprintf(ebuf, ebuflen,
-			    "%s: %s", desc, strerror(ERANGE));
-			return (0);
+			errno = ERANGE;
+			snprintf(ebuf, ebuflen, "%s: %s", desc, strerror(errno));
+			return 0;
 		}
 		break;
 	default:
- badnum:	snprintf(ebuf, ebuflen,
-		    "%s `%s': illegal number", desc, val);
-		return (0);
+ badnum:
+		snprintf(ebuf, ebuflen, "%s `%s': illegal number", desc, val);
+		return 0;
 	}
 	if (num < min) {
-			/* LONGLONG */
+		/* LONGLONG */
 		snprintf(ebuf, ebuflen, "%s %lld is less than %lld.",
 		    desc, (long long)num, (long long)min);
-		return (0);
+		return 0;
 	}
 	if (num > max) {
-			/* LONGLONG */
-		snprintf(ebuf, ebuflen,
-		    "%s %lld is greater than %lld.",
-		    desc, (long long)num, (long long)min);
-		return (0);
+		/* LONGLONG */
+		snprintf(ebuf, ebuflen, "%s %lld is greater than %lld.",
+		    desc, (long long)num, (long long)max);
+		return 0;
 	}
 	*ebuf = '\0';
-	return (num);
+	return num;
+}
+
+long long
+strsuftollx(const char *desc, const char *val,
+    long long min, long long max, char *ebuf, size_t ebuflen)
+{
+	return __strsuftollx(desc, val, min, max, ebuf, ebuflen, 0);
 }
+#endif /* !HAVE_STRSUFTOLL */

Reply via email to