diff options
author | ache <ache@FreeBSD.org> | 2002-08-02 01:04:49 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 2002-08-02 01:04:49 +0000 |
commit | fcd05421a144c13358ae318ae789fdeb09023a82 (patch) | |
tree | 08950b52a8b79d8ff70716c954a0ac3ef9e7fb84 | |
parent | 5ca8a85ebeb62a74870eefbb8b231e7c10caa5db (diff) | |
download | FreeBSD-src-fcd05421a144c13358ae318ae789fdeb09023a82.zip FreeBSD-src-fcd05421a144c13358ae318ae789fdeb09023a82.tar.gz |
Prevent out of bounds writting for too many slashes case.
Replace strnpy + ='\0' with strlcpy
MFC after: 1 day
-rw-r--r-- | lib/libc/locale/setlocale.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/lib/libc/locale/setlocale.c b/lib/libc/locale/setlocale.c index 8b18d1e..9b80941 100644 --- a/lib/libc/locale/setlocale.c +++ b/lib/libc/locale/setlocale.c @@ -129,33 +129,29 @@ setlocale(category, locale) if (!env || !*env || strchr(env, '/')) env = "C"; - (void) strncpy(new_categories[category], env, ENCODING_LEN); - new_categories[category][ENCODING_LEN] = '\0'; + (void)strlcpy(new_categories[category], env, ENCODING_LEN + 1); if (category == LC_ALL) { for (i = 1; i < _LC_LAST; ++i) { if (!(env = getenv(categories[i])) || !*env) env = new_categories[LC_ALL]; - (void)strncpy(new_categories[i], env, ENCODING_LEN); - new_categories[i][ENCODING_LEN] = '\0'; + (void)strlcpy(new_categories[i], env, ENCODING_LEN + 1); } } - } else if (category != LC_ALL) { - (void)strncpy(new_categories[category], locale, ENCODING_LEN); - new_categories[category][ENCODING_LEN] = '\0'; - } else { + } else if (category != LC_ALL) + (void)strlcpy(new_categories[category], locale, ENCODING_LEN + 1); + else { if ((r = strchr(locale, '/')) == NULL) { - for (i = 1; i < _LC_LAST; ++i) { - (void)strncpy(new_categories[i], locale, ENCODING_LEN); - new_categories[i][ENCODING_LEN] = '\0'; - } + for (i = 1; i < _LC_LAST; ++i) + (void)strlcpy(new_categories[i], locale, ENCODING_LEN + 1); } else { for (i = 1; r[1] == '/'; ++r); if (!r[1]) return (NULL); /* Hmm, just slashes... */ do { + if (i == _LC_LAST) + return(NULL); /* Too many slashes... */ len = r - locale > ENCODING_LEN ? ENCODING_LEN : r - locale; - (void)strncpy(new_categories[i], locale, len); - new_categories[i][len] = '\0'; + (void)strlcpy(new_categories[i], locale, len + 1); i++; locale = r; while (*locale == '/') |