Module Name:    src
Committed By:   mlelstv
Date:           Sun Apr 16 20:37:59 UTC 2023

Modified Files:
        src/lib/libc/locale: newlocale.c

Log Message:
Fix parsing a locale string with multiple components.
Also check for truncation of a long locale string.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/lib/libc/locale/newlocale.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/locale/newlocale.c
diff -u src/lib/libc/locale/newlocale.c:1.3 src/lib/libc/locale/newlocale.c:1.4
--- src/lib/libc/locale/newlocale.c:1.3	Fri Sep 13 13:13:32 2013
+++ src/lib/libc/locale/newlocale.c	Sun Apr 16 20:37:59 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: newlocale.c,v 1.3 2013/09/13 13:13:32 joerg Exp $ */
+/* $NetBSD: newlocale.c,v 1.4 2023/04/16 20:37:59 mlelstv Exp $ */
 
 /*-
  * Copyright (c)2008, 2011 Citrus Project,
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: newlocale.c,v 1.3 2013/09/13 13:13:32 joerg Exp $");
+__RCSID("$NetBSD: newlocale.c,v 1.4 2023/04/16 20:37:59 mlelstv Exp $");
 
 #include "namespace.h"
 #include <assert.h>
@@ -57,7 +57,10 @@ newlocale(int mask, const char *name, lo
 	if (src == NULL)
 		src = _current_locale();
 	memcpy(dst, src, sizeof(*src));
-	strlcpy(&head[0], name, sizeof(head));
+	if (strlcpy(&head[0], name, sizeof(head)) >= sizeof(head)) {
+		free(dst);
+		return (locale_t)NULL;
+	}
 	tokens[0] = (const char *)&head[0];
 	tail = strchr(tokens[0], '/');
 	if (tail == NULL) {
@@ -77,6 +80,7 @@ newlocale(int mask, const char *name, lo
 		}
 		if (howmany-- > 0) {
 			for (i = 1; i < howmany; ++i) {
+				*tail++ = '\0';
 				tokens[i] = (const char *)tail;
 				tail = strchr(tokens[i], '/');
 				if (tail == NULL) {
@@ -84,6 +88,7 @@ newlocale(int mask, const char *name, lo
 					return NULL;
 				}
 			}
+			*tail++ = '\0';
 			tokens[howmany] = tail;
 			tail = strchr(tokens[howmany], '/');
 			if (tail != NULL) {

Reply via email to