@@ -673,9 +673,10 @@ child_exec(char *const exec_array[],
673673 PyObject * preexec_fn ,
674674 PyObject * preexec_fn_args_tuple )
675675{
676- int i , saved_errno , reached_preexec = 0 ;
676+ int i , saved_errno ;
677677 PyObject * result ;
678- const char * err_msg = "" ;
678+ /* Indicate to the parent that the error happened before exec(). */
679+ const char * err_msg = "noexec" ;
679680 /* Buffer large enough to hold a hex integer. We can't malloc. */
680681 char hex_errno [sizeof (saved_errno )* 2 + 1 ];
681682
@@ -735,8 +736,12 @@ child_exec(char *const exec_array[],
735736 /* We no longer manually close p2cread, c2pwrite, and errwrite here as
736737 * _close_open_fds takes care when it is not already non-inheritable. */
737738
738- if (cwd )
739- POSIX_CALL (chdir (cwd ));
739+ if (cwd ) {
740+ if (chdir (cwd ) == -1 ) {
741+ err_msg = "noexec:chdir" ;
742+ goto error ;
743+ }
744+ }
740745
741746 if (child_umask >= 0 )
742747 umask (child_umask ); /* umask() always succeeds. */
@@ -784,7 +789,7 @@ child_exec(char *const exec_array[],
784789#endif /* HAVE_SETREUID */
785790
786791
787- reached_preexec = 1 ;
792+ err_msg = "" ;
788793 if (preexec_fn != Py_None && preexec_fn_args_tuple ) {
789794 /* This is where the user has asked us to deadlock their program. */
790795 result = PyObject_Call (preexec_fn , preexec_fn_args_tuple , NULL );
@@ -842,16 +847,12 @@ child_exec(char *const exec_array[],
842847 }
843848 _Py_write_noraise (errpipe_write , cur , hex_errno + sizeof (hex_errno ) - cur );
844849 _Py_write_noraise (errpipe_write , ":" , 1 );
845- if (!reached_preexec ) {
846- /* Indicate to the parent that the error happened before exec(). */
847- _Py_write_noraise (errpipe_write , "noexec" , 6 );
848- }
849850 /* We can't call strerror(saved_errno). It is not async signal safe.
850851 * The parent process will look the error message up. */
851852 } else {
852853 _Py_write_noraise (errpipe_write , "SubprocessError:0:" , 18 );
853- _Py_write_noraise (errpipe_write , err_msg , strlen (err_msg ));
854854 }
855+ _Py_write_noraise (errpipe_write , err_msg , strlen (err_msg ));
855856}
856857
857858
0 commit comments