]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
archive_string_conversion_charset_name: Fix calls for current locale
authorBrad King <brad.king@kitware.com>
Wed, 4 Feb 2026 21:08:05 +0000 (16:08 -0500)
committerBrad King <brad.king@kitware.com>
Fri, 6 Feb 2026 00:26:43 +0000 (19:26 -0500)
Some code paths may call `archive_string_conversion_charset_name(sconv)`
with `sconv == NULL` when converting to/from the current locale.

libarchive/archive_string.c
libarchive/test/test_archive_string_conversion.c

index 2646f7b76da840b3fb9418a1d044024ddaecf524..2edd1457ec63540bcf199b4cc14faf33cba61ed4 100644 (file)
@@ -1873,6 +1873,9 @@ archive_string_conversion_free(struct archive *a)
 const char *
 archive_string_conversion_charset_name(struct archive_string_conv *sc)
 {
+       if (sc == NULL) {
+               return "current locale";
+       }
        if (sc->flag & SCONV_TO_CHARSET)
                return (sc->to_charset);
        else
index 69419fc3946a0f0676707a6d6d297779259d8887..3cf14353353b067f9dd94538c09e8b5b3a955c61 100644 (file)
@@ -883,6 +883,14 @@ DEFINE_TEST(test_archive_string_conversion)
        test_archive_string_set_get();
 }
 
+static void
+test_archive_string_conversion_fail_charset(void)
+{
+       /* Conversion error message construction may use the charset name.  */
+       assertEqualString("current locale",
+           archive_string_conversion_charset_name(NULL));
+}
+
 static void
 test_archive_string_conversion_fail_utf16_mbs(struct archive *a,
     struct archive_string_conv *sconv)
@@ -961,6 +969,8 @@ DEFINE_TEST(test_archive_string_conversion_fail_c)
 
        /* Test the C locale by not calling setlocale.  */
 
+       test_archive_string_conversion_fail_charset();
+
        assert((a = archive_write_new()) != NULL);
 
        test_archive_string_conversion_fail_utf16_mbs(a, NULL);
@@ -987,6 +997,8 @@ DEFINE_TEST(test_archive_string_conversion_fail_latin1)
                return;
        }
 
+       test_archive_string_conversion_fail_charset();
+
        assert((a = archive_write_new()) != NULL);
 
 #if defined(_WIN32) && !defined(__CYGWIN__)