aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2026-05-20 16:39:40 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2026-06-02 16:41:37 +0000
commite6470ed3d59b5c36262a9cdb76b71a7ad25d173b (patch)
treebbc5d02c0f5b472fccfd1335f1521214fdaf112c
parenta13800ee46d74d188c5d4dbf51997c8149dab0f6 (diff)
libarchive: Force GNU iconv compatibility on FreeBSD
When libarchive is compiled with FreeBSD's native iconv instead of libiconv, as happens with libarchive in the base system, we need to configure iconv(3) to handle invalid sequences by returning -1, as iconv_strncat_in_locale() assumes GNU iconv semantics. This corresponds to upstream PR 3056. PR: 294577 MFC after: 1 week (cherry picked from commit bd15d6ef126ee4c0eac931117f6bbbf6f9a3fc72)
-rw-r--r--contrib/libarchive/libarchive/archive_string.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/contrib/libarchive/libarchive/archive_string.c b/contrib/libarchive/libarchive/archive_string.c
index c6ae8968d54f..4fb96a9fa178 100644
--- a/contrib/libarchive/libarchive/archive_string.c
+++ b/contrib/libarchive/libarchive/archive_string.c
@@ -1314,7 +1314,17 @@ create_sconv_object(const char *fc, const char *tc,
else if (strcmp(fc, "CP932") == 0)
sc->cd = iconv_open(tc, "SJIS");
}
-#if defined(_WIN32) && !defined(__CYGWIN__)
+#if defined(__FreeBSD__) && !defined(HAVE_LIBICONV)
+ /*
+ * FreeBSD's native iconv() by default returns the number of
+ * invalid characters in the input string, as specified by
+ * POSIX, but iconv_strncat_in_locale() assumes GNU iconv
+ * semantics.
+ */
+ int v = 1;
+
+ (void)iconvctl(sc->cd, ICONV_SET_ILSEQ_INVALID, &v);
+#elif defined(_WIN32) && !defined(__CYGWIN__)
/*
* archive_mstring on Windows directly convert multi-bytes
* into archive_wstring in order not to depend on locale