]> granicus.if.org Git - python/commitdiff
Issue #8393: subprocess accepts bytes, bytearray and str with surrogates for
authorVictor Stinner <victor.stinner@haypocalc.com>
Fri, 16 Apr 2010 23:49:32 +0000 (23:49 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Fri, 16 Apr 2010 23:49:32 +0000 (23:49 +0000)
the current working directory.

Remove also a trailing space, and replace tabulation indentation by spaces.

Misc/NEWS
Modules/_posixsubprocess.c

index 7e30651a473112768559a4d33040c008296a2486..a6e858662eca8233e185cf3e788afc0d2ff93663 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -315,6 +315,9 @@ C-API
 Library
 -------
 
+- Issue #8393: subprocess accepts bytes, bytearray and str with surrogates for
+  the current working directory.
+
 - Issue #7606: XML-RPC traceback stored in X-traceback is now encoded to ASCII
   using backslashreplace error handler
 
index a6008efa04b49f1bf60a443af204d5e64ae38c3b..24a70bc58e6ba3d0f42d57bde56384d38865a694 100644 (file)
@@ -177,6 +177,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
     int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite;
     int errpipe_read, errpipe_write, close_fds, restore_signals;
     int call_setsid;
+    PyObject *cwd_obj, *cwd_obj2;
     const char *cwd;
     pid_t pid;
     int need_to_reenable_gc = 0;
@@ -184,8 +185,9 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
     Py_ssize_t arg_num;
 
     if (!PyArg_ParseTuple(
-            args, "OOOzOiiiiiiiiiiO:fork_exec",
-            &process_args, &executable_list, &py_close_fds, &cwd, &env_list,
+            args, "OOOOOiiiiiiiiiiO:fork_exec",
+            &process_args, &executable_list, &py_close_fds,
+            &cwd_obj, &env_list,
             &p2cread, &p2cwrite, &c2pread, &c2pwrite,
             &errread, &errwrite, &errpipe_read, &errpipe_write,
             &restore_signals, &call_setsid, &preexec_fn))
@@ -263,13 +265,25 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
         preexec_fn_args_tuple = PyTuple_New(0);
         if (!preexec_fn_args_tuple)
             goto cleanup;
-       _PyImport_AcquireLock();
+        _PyImport_AcquireLock();
+    }
+
+    if (cwd_obj != Py_None) {
+        if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0)
+            goto cleanup;
+        if (PyBytes_Check(cwd_obj2))
+            cwd = PyBytes_AS_STRING(cwd_obj2);
+        else
+            cwd = PyByteArray_AS_STRING(cwd_obj2);
+    } else {
+        cwd = NULL;
+        cwd_obj2 = NULL;
     }
 
     pid = fork();
     if (pid == 0) {
         /* Child process */
-        /* 
+        /*
          * Code from here to _exit() must only use async-signal-safe functions,
          * listed at `man 7 signal` or
          * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
@@ -291,6 +305,8 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
         _exit(255);
         return NULL;  /* Dead code to avoid a potential compiler warning. */
     }
+    Py_XDECREF(cwd_obj2);
+
     if (pid == -1) {
         /* Capture the errno exception before errno can be clobbered. */
         PyErr_SetFromErrno(PyExc_OSError);