Issue 14706: Inconsistent os.access os.X_OK on Solaris and AIX when running as root (original) (raw)

The return value of os.access(FILE, os.X_OK) is not consistent across operating system when executed as "root"

I have tested with Python 2.5 on Linux and Solaris, but there is a bug in python-nose reporting the same behavior with Python 2.6 on Solaris and AIX. http://code.google.com/p/python-nose/issues/detail?id=423


On Solaris:

$ ls -al -rw-rw-r-- 1 buildslave other 1079 May 1 16:25 nose_runner.py

$ ./bin/python Python 2.5.6 (r256:88840, Nov 1 2011, 12:19:05) [GCC 3.4.3 (csl-sol210-3_4-branch+sol_rpath)] on sunos5 Type "help", "copyright", "credits" or "license" for more information.

import os os.access('nose_runner.py', os.X_OK) False

$ sudo ./bin/python Python 2.5.6 (r256:88840, Nov 1 2011, 12:19:05) [GCC 3.4.3 (csl-sol210-3_4-branch+sol_rpath)] on sunos5 Type "help", "copyright", "credits" or "license" for more information.

import os os.access('nose_runner.py', os.X_OK) True


On Linux:

$ ls -al -rw-rw-r-- 1 adi adi 1079 2012-05-02 11:25 nose_runner.py

$ ./bin/python Python 2.5.5 (r255:77872, Sep 14 2010, 16:22:46) [GCC 4.4.5] on linux2

import os os.access('nose_runner.py', os.X_OK) False

$ sudo ./bin/python Python 2.5.5 (r255:77872, Sep 14 2010, 16:22:46) [GCC 4.4.5] on linux2

import os os.access('nose_runner.py', os.X_OK) False

This is not a Python bug. os.access() is just a wrapper around the POSIX access() function: http://pubs.opengroup.org/onlinepubs/9699919799/functions/faccessat.html

“If any access permissions are checked, each shall be checked individually, as described in XBD File Access Permissions, except that where that description refers to execute permission for a process with appropriate privileges, an implementation may indicate success for X_OK even if execute permission is not granted to any user.”

So this seems to be a well-known portability problem accross Unix implementations. If you want to test the executable bits, just use os.stat().