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())
  */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to