]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Add fallback in case of locale initialization failure
authorTomas Mraz <tomas@openssl.org>
Tue, 10 May 2022 15:00:26 +0000 (17:00 +0200)
committerTomas Mraz <tomas@openssl.org>
Fri, 13 May 2022 06:30:48 +0000 (08:30 +0200)
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/18282)

crypto/o_str.c
include/internal/e_os.h

index ede2ee4f5820c4a56b541b164ea09451ef22611b..d91ac8ff84ed7a6880a00dc46cf26a0f38891adc 100644 (file)
@@ -349,8 +349,8 @@ int openssl_strerror_r(int errnum, char *buf, size_t buflen)
 #ifndef OPENSSL_NO_LOCALE
 static locale_t loc;
 
-static void *ossl_c_locale(void) {
-    return (void *)loc;
+static locale_t ossl_c_locale(void) {
+    return loc;
 }
 
 int ossl_init_casecmp_int(void) {
@@ -359,21 +359,32 @@ int ossl_init_casecmp_int(void) {
 # else
     loc = newlocale(LC_COLLATE_MASK, "C", (locale_t) 0);
 # endif
-    return (loc == (locale_t) 0) ? 0 : 1;
+    return (loc == (locale_t)0) ? 0 : 1;
 }
 
 void ossl_deinit_casecmp(void) {
     freelocale(loc);
+    loc = (locale_t)0;
 }
 
 int OPENSSL_strcasecmp(const char *s1, const char *s2)
 {
-    return strcasecmp_l(s1, s2, (locale_t)ossl_c_locale());
+    locale_t l = ossl_c_locale();
+
+    /* Fallback in case of locale initialization failure */
+    if (l == (locale_t)0)
+        return strcasecmp(s1, s2);
+    return strcasecmp_l(s1, s2, l);
 }
 
 int OPENSSL_strncasecmp(const char *s1, const char *s2, size_t n)
 {
-    return strncasecmp_l(s1, s2, n, (locale_t)ossl_c_locale());
+    locale_t l = ossl_c_locale();
+
+    /* Fallback in case of locale initialization failure */
+    if (l == (locale_t)0)
+        return strncasecmp(s1, s2, n);
+    return strncasecmp_l(s1, s2, n, l);
 }
 #else
 int ossl_init_casecmp_int(void) {
index fd45d2088bbf8eb6540e6d7213d9e540535ecc10..9e2f14072f6cf7acdb9ddd7079c443a75d94a49a 100644 (file)
@@ -421,6 +421,7 @@ inline int nssgetpid();
 #  define strcasecmp_l _stricmp_l
 #  define strncasecmp_l _strnicmp_l
 #  define strcasecmp _stricmp
+#  define strncasecmp _strnicmp
 # elif !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200809L \
      || defined(OPENSSL_SYS_TANDEM)
 #  ifndef OPENSSL_NO_LOCALE