diff options
author | Saiyang Gou <gousaiyang@163.com> | 2020-02-05 00:15:00 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-05 00:15:00 (GMT) |
commit | 95f60010219e142a436fae18e1695cbc45407afe (patch) | |
tree | f908dd8bad7c24219c72f6602d47f1496a4baf86 /Modules/posixmodule.c | |
parent | 40e547dfbb9052ca0c667b242f6825ed1c23c195 (diff) | |
download | cpython-95f60010219e142a436fae18e1695cbc45407afe.zip cpython-95f60010219e142a436fae18e1695cbc45407afe.tar.gz cpython-95f60010219e142a436fae18e1695cbc45407afe.tar.bz2 |
bpo-39184: Add audit events to command execution functions in os and pty modules (GH-17824)
Diffstat (limited to 'Modules/posixmodule.c')
-rw-r--r-- | Modules/posixmodule.c | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index b71eddf..ec3da4f 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -5234,6 +5234,12 @@ os_execv_impl(PyObject *module, path_t *path, PyObject *argv) return NULL; } + if (PySys_Audit("os.exec", "OOO", path->object ? path->object : Py_None, + argv, Py_None) < 0) { + free_string_array(argvlist, argc); + return NULL; + } + _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_WEXECV _wexecv(path->wide, argvlist); @@ -5277,7 +5283,7 @@ os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env) if (!PyList_Check(argv) && !PyTuple_Check(argv)) { PyErr_SetString(PyExc_TypeError, "execve: argv must be a tuple or list"); - goto fail; + goto fail_0; } argc = PySequence_Size(argv); if (argc < 1) { @@ -5288,22 +5294,27 @@ os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env) if (!PyMapping_Check(env)) { PyErr_SetString(PyExc_TypeError, "execve: environment must be a mapping object"); - goto fail; + goto fail_0; } argvlist = parse_arglist(argv, &argc); if (argvlist == NULL) { - goto fail; + goto fail_0; } if (!argvlist[0][0]) { PyErr_SetString(PyExc_ValueError, "execve: argv first element cannot be empty"); - goto fail; + goto fail_0; } envlist = parse_envlist(env, &envc); if (envlist == NULL) - goto fail; + goto fail_0; + + if (PySys_Audit("os.exec", "OOO", path->object ? path->object : Py_None, + argv, env) < 0) { + goto fail_1; + } _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_FEXECVE @@ -5321,9 +5332,9 @@ os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env) /* If we get here it's definitely an error */ posix_path_error(path); - + fail_1: free_string_array(envlist, envc); - fail: + fail_0: if (argvlist) free_string_array(argvlist, argc); return NULL; @@ -5654,6 +5665,11 @@ py_posix_spawn(int use_posix_spawnp, PyObject *module, path_t *path, PyObject *a } attrp = &attr; + if (PySys_Audit("os.posix_spawn", "OOO", + path->object ? path->object : Py_None, argv, env) < 0) { + goto exit; + } + _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_POSIX_SPAWNP if (use_posix_spawnp) { @@ -5894,6 +5910,13 @@ os_spawnv_impl(PyObject *module, int mode, path_t *path, PyObject *argv) mode = _P_OVERLAY; #endif + if (PySys_Audit("os.spawn", "iOOO", mode, + path->object ? path->object : Py_None, argv, + Py_None) < 0) { + free_string_array(argvlist, argc); + return NULL; + } + Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_WSPAWNV @@ -6003,6 +6026,11 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv, mode = _P_OVERLAY; #endif + if (PySys_Audit("os.spawn", "iOOO", mode, + path->object ? path->object : Py_None, argv, env) < 0) { + goto fail_2; + } + Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_WSPAWNV @@ -6021,6 +6049,7 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv, else res = Py_BuildValue(_Py_PARSE_INTPTR, spawnval); + fail_2: while (--envc >= 0) PyMem_DEL(envlist[envc]); PyMem_DEL(envlist); @@ -11701,6 +11730,12 @@ os_startfile_impl(PyObject *module, path_t *filepath, "startfile not available on this platform"); } + if (PySys_Audit("os.startfile", "Ou", + filepath->object ? filepath->object : Py_None, + operation) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS rc = Py_ShellExecuteW((HWND)0, operation, filepath->wide, NULL, NULL, SW_SHOWNORMAL); |