https://github.com/python/cpython/commit/c575172425fa792845dd686a1b2f114982accd23
commit: c575172425fa792845dd686a1b2f114982accd23
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2026-05-15T15:55:34Z
summary:

gh-149879: Fix sys.orig_argv[0] on Cygwin: add ".exe" suffix (#149885)

files:
M Python/initconfig.c

diff --git a/Python/initconfig.c b/Python/initconfig.c
index a996fb117aab9d..e0bdadf491bad3 100644
--- a/Python/initconfig.c
+++ b/Python/initconfig.c
@@ -3688,6 +3688,44 @@ PyConfig_SetWideStringList(PyConfig *config, 
PyWideStringList *list,
 }
 
 
+#ifdef __CYGWIN__
+// Cygwin strips ".exe" suffix from argv[0].
+// Add again the ".exe" suffix.
+static PyStatus
+config_argv0_add_exe(PyConfig *config)
+{
+    if (config->argv.length < 1) {
+        return _PyStatus_OK();
+    }
+    const wchar_t *argv0 = config->argv.items[0];
+    size_t len = wcslen(argv0);
+    if (len >= 5 && wcscmp(argv0 + len - 4, L".exe") == 0) {
+        return _PyStatus_OK();
+    }
+
+    wchar_t *exe = PyMem_RawMalloc((len + 4 + 1) * sizeof(wchar_t));
+    if (exe == NULL) {
+        return _PyStatus_NO_MEMORY();
+    }
+    wcscpy(exe, argv0);
+    wcscat(exe, L".exe");
+
+    FILE *fp = _Py_wfopen(exe, L"rb");
+    if (fp != NULL) {
+        fclose(fp);
+
+        PyMem_RawFree(config->argv.items[0]);
+        config->argv.items[0] = exe;
+    }
+    else {
+        PyMem_RawFree(exe);
+    }
+
+    return _PyStatus_OK();
+}
+#endif
+
+
 /* Read the configuration into PyConfig from:
 
    * Command line arguments
@@ -3707,6 +3745,13 @@ _PyConfig_Read(PyConfig *config, int compute_path_config)
 
     config_get_global_vars(config);
 
+#ifdef __CYGWIN__
+    status = config_argv0_add_exe(config);
+    if (_PyStatus_EXCEPTION(status)) {
+        return status;
+    }
+#endif
+
     if (config->orig_argv.length == 0
         && !(config->argv.length == 1
              && wcscmp(config->argv.items[0], L"") == 0))

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to