[Python-checkins] r80135 - in python/branches/py3k: Misc/NEWS Modules/_posixsubprocess.c

victor.stinner python-checkins at python.org
Sat Apr 17 01:49:32 CEST 2010


Author: victor.stinner
Date: Sat Apr 17 01:49:32 2010
New Revision: 80135

Log:
Issue #8393: subprocess accepts bytes, bytearray and str with surrogates for
the current working directory.

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


Modified:
   python/branches/py3k/Misc/NEWS
   python/branches/py3k/Modules/_posixsubprocess.c

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Sat Apr 17 01:49:32 2010
@@ -315,6 +315,9 @@
 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
 

Modified: python/branches/py3k/Modules/_posixsubprocess.c
==============================================================================
--- python/branches/py3k/Modules/_posixsubprocess.c	(original)
+++ python/branches/py3k/Modules/_posixsubprocess.c	Sat Apr 17 01:49:32 2010
@@ -177,6 +177,7 @@
     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 @@
     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 @@
         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 @@
         _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);


More information about the Python-checkins mailing list