Author: Alex Gaynor <[email protected]>
Branch:
Changeset: r73244:b4f58b28e57d
Date: 2014-08-31 10:23 -0700
http://bitbucket.org/pypy/pypy/changeset/b4f58b28e57d/
Log: Merged in dripton/pypy/fix_find_executable_bug (pull request #276)
issue #1856, find_executable should only find executable files.
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))
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit