Fix parsing a locale string with multiple components.
Also check for truncation of a long locale string.
This commit is contained in:
parent
078e15f2b8
commit
9d5943131b
|
@ -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,
|
* Copyright (c)2008, 2011 Citrus Project,
|
||||||
|
@ -27,7 +27,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#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 "namespace.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
@ -57,7 +57,10 @@ newlocale(int mask, const char *name, locale_t src)
|
||||||
if (src == NULL)
|
if (src == NULL)
|
||||||
src = _current_locale();
|
src = _current_locale();
|
||||||
memcpy(dst, src, sizeof(*src));
|
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];
|
tokens[0] = (const char *)&head[0];
|
||||||
tail = strchr(tokens[0], '/');
|
tail = strchr(tokens[0], '/');
|
||||||
if (tail == NULL) {
|
if (tail == NULL) {
|
||||||
|
@ -77,6 +80,7 @@ newlocale(int mask, const char *name, locale_t src)
|
||||||
}
|
}
|
||||||
if (howmany-- > 0) {
|
if (howmany-- > 0) {
|
||||||
for (i = 1; i < howmany; ++i) {
|
for (i = 1; i < howmany; ++i) {
|
||||||
|
*tail++ = '\0';
|
||||||
tokens[i] = (const char *)tail;
|
tokens[i] = (const char *)tail;
|
||||||
tail = strchr(tokens[i], '/');
|
tail = strchr(tokens[i], '/');
|
||||||
if (tail == NULL) {
|
if (tail == NULL) {
|
||||||
|
@ -84,6 +88,7 @@ newlocale(int mask, const char *name, locale_t src)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*tail++ = '\0';
|
||||||
tokens[howmany] = tail;
|
tokens[howmany] = tail;
|
||||||
tail = strchr(tokens[howmany], '/');
|
tail = strchr(tokens[howmany], '/');
|
||||||
if (tail != NULL) {
|
if (tail != NULL) {
|
||||||
|
|
Loading…
Reference in New Issue