[pypy-commit] pypy fix_find_executable_bug: issue #1856, find_executable should only find executable files.
dripton
noreply at buildbot.pypy.org
Sun Aug 31 19:23:50 CEST 2014
Author: David Ripton <dripton at ripton.net>
Branch: fix_find_executable_bug
Changeset: r73243:8ff323403724
Date: 2014-08-31 11:20 -0400
http://bitbucket.org/pypy/pypy/changeset/8ff323403724/
Log: issue #1856, find_executable should only find executable files.
We use os.access to check whether the file is executable by the
current user. os.access compares against the user's real uid and
gid, not the effective uid and gid. I think that's okay because
nobody should be running pypy setuid/setgid.
diff --git a/pypy/module/sys/initpath.py b/pypy/module/sys/initpath.py
--- a/pypy/module/sys/initpath.py
+++ b/pypy/module/sys/initpath.py
@@ -35,8 +35,12 @@
for dir in path.split(os.pathsep):
fn = os.path.join(dir, executable)
if os.path.isfile(fn):
- executable = fn
- break
+ # os.access checks using the user's real uid and gid.
+ # Since pypy should not be run setuid/setgid, this
+ # should be sufficient.
+ if os.access(fn, os.X_OK):
+ executable = fn
+ break
executable = rpath.rabspath(executable)
# 'sys.executable' should not end up being an non-existing file;
diff --git a/pypy/module/sys/test/test_initpath.py b/pypy/module/sys/test/test_initpath.py
--- a/pypy/module/sys/test/test_initpath.py
+++ b/pypy/module/sys/test/test_initpath.py
@@ -57,6 +57,7 @@
a.join('pypy').ensure(file=True)
b.join('pypy').ensure(file=True)
#
+ monkeypatch.setattr(os, 'access', lambda x, y: True)
# if there is already a slash, don't do anything
monkeypatch.chdir(tmpdir)
assert find_executable('a/pypy') == a.join('pypy')
@@ -82,7 +83,11 @@
# if pypy is found but it's not a file, ignore it
c.join('pypy').ensure(dir=True)
assert find_executable('pypy') == a.join('pypy')
+ # if pypy is found but it's not executable, ignore it
+ monkeypatch.setattr(os, 'access', lambda x, y: False)
+ assert find_executable('pypy') == ''
#
+ monkeypatch.setattr(os, 'access', lambda x, y: True)
monkeypatch.setattr(initpath, 'we_are_translated', lambda: True)
monkeypatch.setattr(initpath, '_WIN32', True)
monkeypatch.setenv('PATH', str(a))
More information about the pypy-commit
mailing list