git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/3] meson: detect broken iconv that requires ICONV_RESTART_RESET

From
Patrick Steinhardt <ps@pks.im>
Date
Mar 5, 2026, 11:20 UTC
Message-ID
<20260305-pks-gitlab-ci-macos-16-v1-2-ce8da0ff29c2@pks.im>
In-Reply-To
<20260305-pks-gitlab-ci-macos-16-v1-0-ce8da0ff29c2@pks.im>

In d0cec08d70 (utf8.c: prepare workaround for iconv under macOS 14/15, 2026-01-12) we have introduced a new workaround for a broken version of libiconv on macOS. This workaround has for now only been wired up for our Makefile, so using Meson with such a broken version will fail.

We can rather easily detect the broken behaviour. Some encodings have different modes that can be switched to via an escape sequence. In the case of ISO-2022-JP this can be done via "<Esc>$B" and "<Esc>(J" to switch between ASCII and JIS modes. The bug now triggers when one does multiple calls to iconv(3p) to convert a string piece by piece, where the first call enters JIS mode. The second call forgets about the fact that it is still in JIS mode, and consequently it will incorrectly treat the input as ASCII, and thus the produced output is of course garbage.

Wire up a test that exercises this in Meson and, if it fails, set the `ICONV_RESTART_RESET` define.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)
diff --git a/meson.build b/meson.build
index ee3d9ced92..1b9be3d36c 100644
--- a/meson.build
+++ b/meson.build
@@ -1060,6 +1060,32 @@ if iconv.found()
     ).returncode() != 0
       libgit_c_args += '-DICONV_OMITS_BOM'
     endif
+
+    if compiler.run('''
+      #include <iconv.h>
+      #include <string.h>
+
+      int main(int argc, const char *argv[])
+      {
+          char in[] = "\x1b\x24\x42\x24\x22\x24\x22\x1b\x28\x42", *inpos = in;
+          char out[7] = { 0 }, *outpos = out;
+          size_t insz = sizeof(in) - 1, outsz = 4;
+          iconv_t conv = iconv_open("UTF-8", "ISO-2022-JP");
+          if (!conv)
+              return 1;
+          if (iconv(conv, (void *) &inpos, &insz, &outpos, &outsz) != (size_t) -1)
+              return 2;
+          outsz = sizeof(out) - (outpos - out);
+          if (iconv(conv, (void *) &inpos, &insz, &outpos, &outsz) == (size_t) -1)
+              return 3;
+          return strcmp("\343\201\202\343\201\202", out) ? 4 : 0;
+      }
+    ''',
+      dependencies: iconv,
+      name: 'iconv handles restarts properly',
+    ).returncode() != 0
+      libgit_c_args += '-DICONV_RESTART_RESET'
+    endif
   endif
 else
   libgit_c_args += '-DNO_ICONV'
-- 
2.53.0.797.g7842e34a66.dirty
Previous: Justin ToblerNext: Justin Tobler
Message 4 of 7 in “gitlab-ci: update to macOS 15 images”
  1. 0/3 gitlab-ci: update to macOS 15 imagesPatrick Steinhardt, Mar 5, 2026
  2. 1/3 meson: simplify iconv-emits-BOM checkPatrick Steinhardt, Mar 5, 2026
  3. Justin ToblerMar 9, 2026
  4. 2/3 meson: detect broken iconv that requires ICONV_RESTART_RESETPatrick Steinhardt, Mar 5, 2026
  5. Justin ToblerMar 9, 2026
  6. 3/3 gitlab-ci: update to macOS 15 imagesPatrick Steinhardt, Mar 5, 2026
  7. Justin ToblerMar 9, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.