svn commit: r309364 - head/usr.bin/locale
Eric van Gyzen
vangyzen at FreeBSD.org
Thu Dec 1 16:54:04 UTC 2016
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())
*/
More information about the svn-src-head
mailing list