summaryrefslogtreecommitdiffstats
path: root/Modules/posixmodule.c
diff options
context:
space:
mode:
authorSaiyang Gou <gousaiyang@163.com>2020-02-05 00:15:00 (GMT)
committerGitHub <noreply@github.com>2020-02-05 00:15:00 (GMT)
commit95f60010219e142a436fae18e1695cbc45407afe (patch)
treef908dd8bad7c24219c72f6602d47f1496a4baf86 /Modules/posixmodule.c
parent40e547dfbb9052ca0c667b242f6825ed1c23c195 (diff)
downloadcpython-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.c49
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);