Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Dec 2016 23:09:22 +0000 (UTC)
From:      Eric van Gyzen <vangyzen@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r310040 - stable/11/usr.bin/locale
Message-ID:  <201612132309.uBDN9M36076551@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: vangyzen
Date: Tue Dec 13 23:09:22 2016
New Revision: 310040
URL: https://svnweb.freebsd.org/changeset/base/310040

Log:
  MFC r309364 r309367 r309624
  
  locale: fix buffer management
  
  Also, handle signed and unsigned chars, and more gracefully handle
  invalid input.
  
  locale: enable more warnings; fix them
  
  Do not set WARNS, so it gets the current default of 6.
  Fix the warnings by sprinkling static, const, or strdup.
  Make some constant data tables const.  Fix whitespace.
  
  Sponsored by:	Dell EMC

Modified:
  stable/11/usr.bin/locale/Makefile
  stable/11/usr.bin/locale/locale.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/usr.bin/locale/Makefile
==============================================================================
--- stable/11/usr.bin/locale/Makefile	Tue Dec 13 22:40:09 2016	(r310039)
+++ stable/11/usr.bin/locale/Makefile	Tue Dec 13 23:09:22 2016	(r310040)
@@ -1,7 +1,6 @@
 # $FreeBSD$
 
 PROG=	locale
-WARNS?=	3
 CFLAGS+= -I${.CURDIR}/../../lib/libc/locale
 
 .include <bsd.prog.mk>

Modified: stable/11/usr.bin/locale/locale.c
==============================================================================
--- stable/11/usr.bin/locale/locale.c	Tue Dec 13 22:40:09 2016	(r310039)
+++ stable/11/usr.bin/locale/locale.c	Tue Dec 13 23:09:22 2016	(r310040)
@@ -57,8 +57,8 @@ void	list_charmaps(void);
 void	list_locales(void);
 const char *lookup_localecat(int);
 char	*kwval_lconv(int);
-int	kwval_lookup(char *, char **, int *, int *);
-void	showdetails(char *);
+int	kwval_lookup(const char *, char **, int *, int *);
+void	showdetails(const char *);
 void	showkeywordslist(char *substring);
 void	showlocale(void);
 void	usage(void);
@@ -66,13 +66,12 @@ void	usage(void);
 /* Global variables */
 static StringList *locales = NULL;
 
-int	all_locales = 0;
-int	all_charmaps = 0;
-int	prt_categories = 0;
-int	prt_keywords = 0;
-int	more_params = 0;
+static int	all_locales = 0;
+static int	all_charmaps = 0;
+static int	prt_categories = 0;
+static int	prt_keywords = 0;
 
-struct _lcinfo {
+static const struct _lcinfo {
 	const char	*name;
 	int		id;
 } lcinfo [] = {
@@ -110,7 +109,7 @@ struct _lcinfo {
 #define	KW_INT_P_SIGN_POSN	(KW_ZERO+21)
 #define	KW_INT_N_SIGN_POSN	(KW_ZERO+22)
 
-struct _kwinfo {
+static const struct _kwinfo {
 	const char	*name;
 	int		isstr;		/* true - string, false - number */
 	int		catid;		/* LC_* */
@@ -224,7 +223,7 @@ struct _kwinfo {
 };
 #define	NKWINFO (nitems(kwinfo))
 
-const char *boguslocales[] = { "UTF-8" };
+static const char *boguslocales[] = { "UTF-8" };
 #define	NBOGUS	(nitems(boguslocales))
 
 int
@@ -296,7 +295,7 @@ main(int argc, char *argv[])
 		} else {
 			uint i;
 			for (i = 0; i < nitems(kwinfo); i++)
-				showdetails ((char *)kwinfo [i].name);
+				showdetails(kwinfo[i].name);
 		}
 		exit(0);
 	}
@@ -341,7 +340,7 @@ list_locales(void)
 static int
 scmp(const void *s1, const void *s2)
 {
-	return strcmp(*(const char **)s1, *(const char **)s2);
+	return strcmp(*(const char * const *)s1, *(const char * const *)s2);
 }
 
 /*
@@ -378,7 +377,7 @@ list_charmaps(void)
 
 	/* add US-ASCII, if not yet added */
 	if (sl_find(charmaps, "US-ASCII") == NULL)
-		sl_add(charmaps, "US-ASCII");
+		sl_add(charmaps, strdup("US-ASCII"));
 
 	/* sort the list */
 	qsort(charmaps->sl_str, charmaps->sl_cur, sizeof(char *), scmp);
@@ -437,10 +436,10 @@ init_locales_list(void)
 	 * we also list 'C' for constistency
 	 */
 	if (sl_find(locales, "POSIX") == NULL)
-		sl_add(locales, "POSIX");
+		sl_add(locales, strdup("POSIX"));
 
 	if (sl_find(locales, "C") == NULL)
-		sl_add(locales, "C");
+		sl_add(locales, strdup("C"));
 
 	/* make output nicer, sort the list */
 	qsort(locales->sl_str, locales->sl_cur, sizeof(char *), scmp);
@@ -495,29 +494,31 @@ 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;
-		}
-	}
-
-	/* Remove the trailing ';'. */
-	rval[len - 1] = '\0';
+#if CHAR_MIN != 0
+		if (*cp < 0)
+			break;		/* garbage input */
+#endif
+		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 */
+	}
+
+	/* 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())
  */
@@ -606,7 +607,7 @@ kwval_lconv(int id)
  * keyword value and properties lookup
  */
 int
-kwval_lookup(char *kwname, char **kwval, int *cat, int *isstr)
+kwval_lookup(const char *kwname, char **kwval, int *cat, int *isstr)
 {
 	int	rval;
 	size_t	i;
@@ -634,7 +635,7 @@ kwval_lookup(char *kwname, char **kwval,
  * command line options specified.
  */
 void
-showdetails(char *kw)
+showdetails(const char *kw)
 {
 	int	isstr, cat, tmpval;
 	char	*kwval;
@@ -649,9 +650,9 @@ showdetails(char *kw)
 	}
 
 	if (prt_categories) {
-		  if (prt_keywords)
+		if (prt_keywords)
 			printf("%-20s ", lookup_localecat(cat));
-		  else
+		else
 			printf("%-20s\t%s\n", kw, lookup_localecat(cat));
 	}
 



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