Fix parsing a locale string with multiple components.

Also check for truncation of a long locale string.
This commit is contained in:
mlelstv 2023-04-16 20:37:59 +00:00
parent 078e15f2b8
commit 9d5943131b
1 changed files with 8 additions and 3 deletions

View File

@ -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, locale_t src)
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, locale_t src)
}
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, locale_t src)
return NULL;
}
}
*tail++ = '\0';
tokens[howmany] = tail;
tail = strchr(tokens[howmany], '/');
if (tail != NULL) {