Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Dec 2016 16:54:02 +0000 (UTC)
From:      Eric van Gyzen <vangyzen@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r309364 - head/usr.bin/locale
Message-ID:  <201612011654.uB1Gs2s4023355@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: vangyzen
Date: Thu Dec  1 16:54:02 2016
New Revision: 309364
URL: https://svnweb.freebsd.org/changeset/base/309364

Log:
  locale: fix buffer management
  
  Also, handle signed and unsigned chars, and more gracefully handle
  invalid input.
  
  Submitted by:	bde in response to r309331
  MFC after:	1 week
  Sponsored by:	Dell EMC

Modified:
  head/usr.bin/locale/locale.c

Modified: head/usr.bin/locale/locale.c
==============================================================================
--- head/usr.bin/locale/locale.c	Thu Dec  1 15:46:26 2016	(r309363)
+++ head/usr.bin/locale/locale.c	Thu Dec  1 16:54:02 2016	(r309364)
@@ -495,29 +495,29 @@ format_grouping(const char *binary)
 {
 	static char rval[64];
 	const char *cp;
-	size_t len;
+	size_t roff;
+	int len;
 
 	rval[0] = '\0';
+	roff = 0;
 	for (cp = binary; *cp != '\0'; ++cp) {
-		char group[sizeof("127;")];
-		snprintf(group, sizeof(group), "%hhd;", *cp);
-		len = strlcat(rval, group, sizeof(rval));
-		if (len >= sizeof(rval)) {
-			len = sizeof(rval) - 1;
-			break;
-		}
-		if (*cp == CHAR_MAX) {
-			break;
-		}
+		if (*cp < 0)
+			break;		/* garbage input */
+		len = snprintf(&rval[roff], sizeof(rval) - roff, "%u;", *cp);
+		if (len < 0 || (unsigned)len >= sizeof(rval) - roff)
+			break;		/* insufficient space for output */
+		roff += len;
+		if (*cp == CHAR_MAX)
+			break;		/* special termination */
 	}
 
-	/* Remove the trailing ';'. */
-	rval[len - 1] = '\0';
+	/* Truncate at the last successfully snprintf()ed semicolon. */
+	if (roff != 0)
+		rval[roff - 1] = '\0';
 
-	return (rval);
+	return (&rval[0]);
 }
 
-
 /*
  * keyword value lookup helper (via localeconv())
  */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201612011654.uB1Gs2s4023355>