]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-131591: Execute the source and not the file to avoid locking it in Windows (#132712)
authorPablo Galindo Salgado <Pablogsal@gmail.com>
Sat, 19 Apr 2025 00:38:12 +0000 (01:38 +0100)
committerGitHub <noreply@github.com>
Sat, 19 Apr 2025 00:38:12 +0000 (00:38 +0000)
Signed-off-by: Pablo Galindo <pablogsal@gmail.com>
Python/ceval_gil.c

index a455779a6598e9bc58d5ba074386b85fd993ca52..ac254363058ec64fc17361d6a209d319960dfdd9 100644 (file)
@@ -1211,41 +1211,9 @@ static inline void run_remote_debugger_script(const char *path)
         return;
     }
 
-    int fd = PyObject_AsFileDescriptor(fileobj);
-    if (fd == -1) {
-        PyErr_FormatUnraisable("Can't find fd for debugger script %s", path);
-    }
-    else {
-        int dup_fd = -1;
-        FILE *f = NULL;
-
-#ifdef MS_WINDOWS
-        dup_fd = _dup(fd);
-        if (dup_fd != -1) {
-            f = _fdopen(dup_fd, "r");
-        }
-        if (!f) {
-            _close(dup_fd);
-        }
-#else
-        dup_fd = dup(fd);
-        if (dup_fd != -1) {
-            f = fdopen(dup_fd, "r");
-        }
-        if (!f) {
-            close(dup_fd);
-        }
-#endif
-        if (!f) {
-            PyErr_SetFromErrno(PyExc_OSError);
-        }
-        else {
-            PyRun_AnyFileEx(f, path, 1);
-        }
-
-        if (PyErr_Occurred()) {
-            PyErr_FormatUnraisable("Error executing debugger script %s", path);
-        }
+    PyObject* source = PyObject_CallMethodNoArgs(fileobj, &_Py_ID(read));
+    if (!source) {
+        PyErr_FormatUnraisable("Error reading debugger script %s", path);
     }
 
     PyObject* res = PyObject_CallMethodNoArgs(fileobj, &_Py_ID(close));
@@ -1255,6 +1223,24 @@ static inline void run_remote_debugger_script(const char *path)
         Py_DECREF(res);
     }
     Py_DECREF(fileobj);
+
+    if (source) {
+        const char *str = PyBytes_AsString(source);
+        if (str) {
+            // PyRun_SimpleString() automatically raises an unraisable
+            // exception if it fails so we don't need to check the return value.
+            PyRun_SimpleString(str);
+        } else {
+            PyErr_FormatUnraisable("Error reading debugger script %s", path);
+        }
+        Py_DECREF(source);
+    }
+
+    // Just in case something went wrong, don't leave this function
+    // with an unhandled exception.
+    if (PyErr_Occurred()) {
+        PyErr_FormatUnraisable("Error executing debugger script %s", path);
+    }
 }
 #endif