Merge "Fix race condition when getting cmdline"

This commit is contained in:
Zuul 2019-09-19 14:02:30 +00:00 committed by Gerrit Code Review
commit d58e6f9d45
2 changed files with 26 additions and 11 deletions

View File

@ -323,8 +323,13 @@ def process_is_running(pid):
def get_cmdline_from_pid(pid):
if not process_is_running(pid):
return []
# NOTE(jh): Even after the above check, the process may terminate
# before the open below happens
try:
with open('/proc/%s/cmdline' % pid, 'r') as f:
cmdline = f.readline().split('\0')[:-1]
except IOError:
return []
# NOTE(slaweq): sometimes it may happen that values in
# /proc/{pid}/cmdline are separated by space instead of NUL char,

View File

@ -336,6 +336,16 @@ class TestGetCmdlineFromPid(base.BaseTestCase):
mock_open.assert_not_called()
self.assertEqual([], cmdline)
def test_cmdline_process_disappearing(self):
self.process_is_running_mock.return_value = True
mock_open = self.useFixture(
lib_fixtures.OpenFixture('/proc/%s/cmdline' % self.pid, 'process')
).mock_open
mock_open.side_effect = IOError()
cmdline = utils.get_cmdline_from_pid(self.pid)
mock_open.assert_called_once_with('/proc/%s/cmdline' % self.pid, 'r')
self.assertEqual([], cmdline)
class TestFindChildPids(base.BaseTestCase):