]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
archive_string_append_from_wcs: Fix silently lossy conversions on Windows
authorBrad King <brad.king@kitware.com>
Wed, 4 Feb 2026 21:42:26 +0000 (16:42 -0500)
committerBrad King <brad.king@kitware.com>
Fri, 6 Feb 2026 00:26:43 +0000 (19:26 -0500)
On Windows, since commit ae54394104 (Implement a string conversion
interface..., 2011-05-09, v3.0.0a~398), `archive_string_append_from_wcs`
no longer returns an error on use of replacement characters in non-C
locales.  Restore the error to avoid silent use of replacement
characters, and for consistency across platforms.

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

index 2edd1457ec63540bcf199b4cc14faf33cba61ed4..a4955d4ceac4e198dcb0d2b82ea141f479ed3742 100644 (file)
@@ -772,7 +772,7 @@ archive_string_append_from_wcs_in_codepage(struct archive_string *as,
                        int r;
 
                        defchar_used = 0;
-                       if (to_cp == CP_UTF8 || sc == NULL)
+                       if (to_cp == CP_UTF8)
                                dp = NULL;
                        else
                                dp = &defchar_used;
index 3cf14353353b067f9dd94538c09e8b5b3a955c61..ecc39dffea7f874870d8be578c53b7d75a2e89ac 100644 (file)
@@ -1006,16 +1006,13 @@ DEFINE_TEST(test_archive_string_conversion_fail_latin1)
            archive_string_conversion_to_charset(a, "CP1252", 0)));
        assertEqualString("CP1252",
            archive_string_conversion_charset_name(sconv));
-       // FIXME: archive_mstring_get_mbs_l from WCS incorrectly succeeds
-       // on an internal conversion attempt using `sconv == NULL`.
-       // test_archive_string_conversion_fail_utf16_mbs(a, sconv);
 #else
        assertA(NULL != (sconv =
            archive_string_conversion_to_charset(a, "ISO8859-1", 0)));
        assertEqualString("ISO8859-1",
            archive_string_conversion_charset_name(sconv));
-       test_archive_string_conversion_fail_utf16_mbs(a, sconv);
 #endif
+       test_archive_string_conversion_fail_utf16_mbs(a, sconv);
        test_archive_string_conversion_fail_utf8_mbs(a, sconv);
 
        assertEqualInt(ARCHIVE_OK, archive_write_free(a));