classification
Title: stat.filemode returns "-" for sockets and unknown types
Type: behavior Stage: patch review
Components: Library (Lib) Versions: Python 3.3, Python 3.4, Python 2.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: christian.heimes, rmilne, vstinner
Priority: normal Keywords: patch

Created on 2013-05-06 09:11 by christian.heimes, last changed 2013-10-21 12:20 by christian.heimes.

Files
File name Uploaded Description Edit
filemode.patch christian.heimes, 2013-05-06 15:27 review
file_modes_strings.patch rmilne, 2013-06-21 13:03 New mode2str function which fixes this bug, and the reverse function str2mode.
Messages (5)
msg188496 - (view) Author: Christian Heimes (christian.heimes) * (Python committer) Date: 2013-05-06 09:11
The function stat.filemode() has a fallback to "-" for file type when it is unable to properly detect the type of a file. This gives wrong results for any file type that is not in the lookup table.

For example it doesn't check for S_ISSOCK:

>>> s = os.stat("/var/run/sdp") t
>>> stat.filemode(s.st_mode)
'-rw-rw-rw-'
$ ls -la /var/run/sdp
srw-rw-rw- 1 root root 0 Mai  2 16:08 /var/run/sdp

Also see #11016 for more file types.

I'm going to work on the matter soonish.
msg188607 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2013-05-06 22:42
Can you maybe add an unit test?
msg191576 - (view) Author: Richard Milne (rmilne) Date: 2013-06-21 13:03
I've added some changes to the module which (I believe) not only fix this bug, but add the reverse function, converting a permission string to a number.

The diff was made against Lib/stat.py @ 84234:f32dad3a243e, which was the most recent version of the file I could find. My patch is intended for Python 2.7, but should work on 3.3 (though I haven't tested it there).

My 'filemode' function ('mode2str') is not as short and elegant as the current one, but then it should fix this bug, and it doesn't require duplicating so many of the module's constants in a lookup table. It also includes a check to make sure mode characters (like 'p', 's', '-', etc) are defined for every numeric mode in the module... so long as their names start with the prefix "S_IF" (... which may lead to conflicts with issue 17924).

I may also have gone beyond the scope, and added code to recognise the git link file mode (see http://stackoverflow.com/questions/737673/how-to-read-the-mode-field-of-git-ls-trees-output), but this extension should be easy to recognise and remove.

Lastly, there are some minor whitespace and sorting changes (notably, S_IF* defs sorted by mode num).

As for tests, I couldn't find any for this module in Lib/test. I have at least included a command line test which exhaustively tests the encoding and decoding of every valid file mode. If you want, I've even a test script which creates an example of every valid file type (apart from socket and git link types), with every valid file mode!
msg191578 - (view) Author: Richard Milne (rmilne) Date: 2013-06-21 13:34
I already see my name change will cause problems. The tarfile.py (Lib/tarfile.py:277) module relies on the function being named 'filemode'.

As the stat.filemode function is relatively new, I don't know how many other modules rely on it. I changed the name because I thought the new name (mode2str) better described what the function does, and is orthogonal to the reverse function (str2mode).

But, of course, I've no issue with whatever the functions are finally named... I'll leave the decision to someone with a bit more experience.
msg200761 - (view) Author: Christian Heimes (christian.heimes) * (Python committer) Date: 2013-10-21 12:20
The C code in Python 3.4's _stat.c module already handle unsupported types correctly. I'm going to apply my patch to the Python implementation in 2.7, 3.3 and 3.4 soonish. Or is somebody against a fix of 2.7 and 3.3?
History
Date User Action Args
2013-10-21 12:20:56christian.heimessetmessages: + msg200761
2013-06-21 13:34:43rmilnesetmessages: + msg191578
2013-06-21 13:03:38rmilnesetfiles: + file_modes_strings.patch
versions: + Python 2.7
nosy: + rmilne

messages: + msg191576
2013-05-06 22:42:37vstinnersetnosy: + vstinner
messages: + msg188607
2013-05-06 15:27:20christian.heimessetfiles: + filemode.patch
keywords: + patch
components: + Library (Lib)
stage: needs patch -> patch review
2013-05-06 09:11:20christian.heimescreate