- dtucker@cvs.openbsd.org 2013/05/16 09:12:31
     [readconf.c servconf.c]
     switch RekeyLimit traffic volume parsing to scan_scaled.  ok djm@
diff --git a/servconf.c b/servconf.c
index 4e3026b..1452393 100644
--- a/servconf.c
+++ b/servconf.c
@@ -1,5 +1,5 @@
 
-/* $OpenBSD: servconf.c,v 1.235 2013/05/16 04:09:14 dtucker Exp $ */
+/* $OpenBSD: servconf.c,v 1.236 2013/05/16 09:12:31 dtucker Exp $ */
 /*
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
  *                    All rights reserved
@@ -30,6 +30,7 @@
 #include <unistd.h>
 #include <stdarg.h>
 #include <errno.h>
+#include <util.h>
 
 #include "openbsd-compat/sys-queue.h"
 #include "xmalloc.h"
@@ -1134,33 +1135,11 @@
 		if (strcmp(arg, "default") == 0) {
 			val64 = 0;
 		} else {
-			if (arg[0] < '0' || arg[0] > '9')
-				fatal("%.200s line %d: Bad number.", filename,
-				    linenum);
-			orig = val64 = strtoll(arg, &endofnumber, 10);
-			if (arg == endofnumber)
-				fatal("%.200s line %d: Bad number.", filename,
-			 linenum);
-	 		switch (toupper(*endofnumber)) {
-			case '\0':
-				scale = 1;
-				break;
-			case 'K':
-				scale = 1<<10;
-				break;
-			case 'M':
-				scale = 1<<20;
-				break;
-			case 'G':
-				scale = 1<<30;
-				break;
-			default:
-				fatal("%.200s line %d: Invalid RekeyLimit "
-				    "suffix", filename, linenum);
-			}
-			val64 *= scale;
-			/* detect integer wrap and too-large limits */
-			if ((val64 / scale) != orig || val64 > UINT_MAX)
+			if (scan_scaled(arg, &val64) == -1)
+				fatal("%.200s line %d: Bad number '%s': %s",
+				    filename, linenum, arg, strerror(errno));
+			/* check for too-large or too-small limits */
+			if (val64 > UINT_MAX)
 				fatal("%.200s line %d: RekeyLimit too large",
 				    filename, linenum);
 			if (val64 != 0 && val64 < 16)