@@ -5156,6 +5156,12 @@ os_execv_impl(PyObject *module, path_t *path, PyObject *argv)
51565156 return NULL ;
51575157 }
51585158
5159+ if (PySys_Audit ("os.exec" , "OOO" , path -> object ? path -> object : Py_None ,
5160+ argv , Py_None ) < 0 ) {
5161+ free_string_array (argvlist , argc );
5162+ return NULL ;
5163+ }
5164+
51595165 _Py_BEGIN_SUPPRESS_IPH
51605166#ifdef HAVE_WEXECV
51615167 _wexecv (path -> wide , argvlist );
@@ -5199,7 +5205,7 @@ os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env)
51995205 if (!PyList_Check (argv ) && !PyTuple_Check (argv )) {
52005206 PyErr_SetString (PyExc_TypeError ,
52015207 "execve: argv must be a tuple or list" );
5202- goto fail ;
5208+ goto fail_0 ;
52035209 }
52045210 argc = PySequence_Size (argv );
52055211 if (argc < 1 ) {
@@ -5210,22 +5216,27 @@ os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env)
52105216 if (!PyMapping_Check (env )) {
52115217 PyErr_SetString (PyExc_TypeError ,
52125218 "execve: environment must be a mapping object" );
5213- goto fail ;
5219+ goto fail_0 ;
52145220 }
52155221
52165222 argvlist = parse_arglist (argv , & argc );
52175223 if (argvlist == NULL ) {
5218- goto fail ;
5224+ goto fail_0 ;
52195225 }
52205226 if (!argvlist [0 ][0 ]) {
52215227 PyErr_SetString (PyExc_ValueError ,
52225228 "execve: argv first element cannot be empty" );
5223- goto fail ;
5229+ goto fail_0 ;
52245230 }
52255231
52265232 envlist = parse_envlist (env , & envc );
52275233 if (envlist == NULL )
5228- goto fail ;
5234+ goto fail_0 ;
5235+
5236+ if (PySys_Audit ("os.exec" , "OOO" , path -> object ? path -> object : Py_None ,
5237+ argv , env ) < 0 ) {
5238+ goto fail_1 ;
5239+ }
52295240
52305241 _Py_BEGIN_SUPPRESS_IPH
52315242#ifdef HAVE_FEXECVE
@@ -5243,9 +5254,9 @@ os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env)
52435254 /* If we get here it's definitely an error */
52445255
52455256 posix_path_error (path );
5246-
5257+ fail_1 :
52475258 free_string_array (envlist , envc );
5248- fail :
5259+ fail_0 :
52495260 if (argvlist )
52505261 free_string_array (argvlist , argc );
52515262 return NULL ;
@@ -5576,6 +5587,11 @@ py_posix_spawn(int use_posix_spawnp, PyObject *module, path_t *path, PyObject *a
55765587 }
55775588 attrp = & attr ;
55785589
5590+ if (PySys_Audit ("os.posix_spawn" , "OOO" ,
5591+ path -> object ? path -> object : Py_None , argv , env ) < 0 ) {
5592+ goto exit ;
5593+ }
5594+
55795595 _Py_BEGIN_SUPPRESS_IPH
55805596#ifdef HAVE_POSIX_SPAWNP
55815597 if (use_posix_spawnp ) {
@@ -5816,6 +5832,13 @@ os_spawnv_impl(PyObject *module, int mode, path_t *path, PyObject *argv)
58165832 mode = _P_OVERLAY ;
58175833#endif
58185834
5835+ if (PySys_Audit ("os.spawn" , "iOOO" , mode ,
5836+ path -> object ? path -> object : Py_None , argv ,
5837+ Py_None ) < 0 ) {
5838+ free_string_array (argvlist , argc );
5839+ return NULL ;
5840+ }
5841+
58195842 Py_BEGIN_ALLOW_THREADS
58205843 _Py_BEGIN_SUPPRESS_IPH
58215844#ifdef HAVE_WSPAWNV
@@ -5925,6 +5948,11 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv,
59255948 mode = _P_OVERLAY ;
59265949#endif
59275950
5951+ if (PySys_Audit ("os.spawn" , "iOOO" , mode ,
5952+ path -> object ? path -> object : Py_None , argv , env ) < 0 ) {
5953+ goto fail_2 ;
5954+ }
5955+
59285956 Py_BEGIN_ALLOW_THREADS
59295957 _Py_BEGIN_SUPPRESS_IPH
59305958#ifdef HAVE_WSPAWNV
@@ -5943,6 +5971,7 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv,
59435971 else
59445972 res = Py_BuildValue (_Py_PARSE_INTPTR , spawnval );
59455973
5974+ fail_2 :
59465975 while (-- envc >= 0 )
59475976 PyMem_DEL (envlist [envc ]);
59485977 PyMem_DEL (envlist );
@@ -11608,6 +11637,12 @@ os_startfile_impl(PyObject *module, path_t *filepath,
1160811637 "startfile not available on this platform" );
1160911638 }
1161011639
11640+ if (PySys_Audit ("os.startfile" , "Ou" ,
11641+ filepath -> object ? filepath -> object : Py_None ,
11642+ operation ) < 0 ) {
11643+ return NULL ;
11644+ }
11645+
1161111646 Py_BEGIN_ALLOW_THREADS
1161211647 rc = Py_ShellExecuteW ((HWND )0 , operation , filepath -> wide ,
1161311648 NULL , NULL , SW_SHOWNORMAL );
0 commit comments