diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2022-09-20 01:00:54 +0200 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2022-09-20 01:00:54 +0200 |
commit | 2b57f247128dc7f243c98c323a301942264d9a5d (patch) | |
tree | c219b9fdc5d54003ed789181c5b854e2ce2f3add /psutil | |
parent | 735de787b84a1c8410d97ce402847bfc0c535487 (diff) | |
download | psutil-2b57f247128dc7f243c98c323a301942264d9a5d.tar.gz |
#2084: document limitations of environ() on macOS Big Sur
Diffstat (limited to 'psutil')
-rw-r--r-- | psutil/_psutil_osx.c | 12 | ||||
-rw-r--r-- | psutil/arch/osx/process_info.c | 9 | ||||
-rwxr-xr-x | psutil/tests/test_contracts.py | 5 |
3 files changed, 20 insertions, 6 deletions
diff --git a/psutil/_psutil_osx.c b/psutil/_psutil_osx.c index cd375bab..f634be36 100644 --- a/psutil/_psutil_osx.c +++ b/psutil/_psutil_osx.c @@ -405,18 +405,24 @@ psutil_proc_cmdline(PyObject *self, PyObject *args) { /* * Return process environment as a Python string. + * On Big Sur this function returns an empty string unless: + * * kernel is DEVELOPMENT || DEBUG + * * target process is same as current_proc() + * * target process is not cs_restricted + * * SIP is off + * * caller has an entitlement */ static PyObject * psutil_proc_environ(PyObject *self, PyObject *args) { pid_t pid; - PyObject *py_retdict = NULL; + PyObject *py_str = NULL; if (! PyArg_ParseTuple(args, _Py_PARSE_PID, &pid)) return NULL; // get the environment block, defined in arch/osx/process_info.c - py_retdict = psutil_get_environ(pid); - return py_retdict; + py_str = psutil_get_environ(pid); + return py_str; } diff --git a/psutil/arch/osx/process_info.c b/psutil/arch/osx/process_info.c index 4af510e8..47330ea6 100644 --- a/psutil/arch/osx/process_info.c +++ b/psutil/arch/osx/process_info.c @@ -241,7 +241,14 @@ error: } -// return process environment as a python string +// Return process environment as a python string. +// On Big Sur this function returns an empty string unless: +// * kernel is DEVELOPMENT || DEBUG +// * target process is same as current_proc() +// * target process is not cs_restricted +// * SIP is off +// * caller has an entitlement +// See: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/kern/kern_sysctl.c#L1315-L1321 PyObject * psutil_get_environ(pid_t pid) { int nargs; diff --git a/psutil/tests/test_contracts.py b/psutil/tests/test_contracts.py index f4ace838..d376a338 100755 --- a/psutil/tests/test_contracts.py +++ b/psutil/tests/test_contracts.py @@ -34,6 +34,7 @@ from psutil import WINDOWS from psutil._compat import FileNotFoundError from psutil._compat import long from psutil._compat import range +from psutil._compat import unicode from psutil.tests import APPVEYOR from psutil.tests import CI_TESTING from psutil.tests import GITHUB_ACTIONS @@ -448,7 +449,7 @@ class TestFetchAllProcesses(PsutilTestCase): self.assertIsInstance(part, str) def exe(self, ret, info): - self.assertIsInstance(ret, (str, type(None))) + self.assertIsInstance(ret, (str, unicode, type(None))) if not ret: self.assertEqual(ret, '') else: @@ -476,7 +477,7 @@ class TestFetchAllProcesses(PsutilTestCase): self.assertGreaterEqual(ret, 0) def name(self, ret, info): - self.assertIsInstance(ret, str) + self.assertIsInstance(ret, (str, unicode)) if APPVEYOR and not ret and info['status'] == 'stopped': return # on AIX, "<exiting>" processes don't have names |