New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
os.fwalk() silently skips remaining directories when error occurs #70047
Comments
I noticed os.fwalk() produced different results as os.walk(). It turned out To reproduce the bug, first create a test directory structure: $ mkdir 1; touch 1/a
$ mkdir 2; touch 2/b
$ mkdir 3; touch 3/c
$ mkdir 4; touch 4/c At this stage, everything is okay, both os.fwalk() os.walk() produce the same >>> import os
>>> for root, dirs, files in os.walk('.'):
... dirs.sort()
... print(root, dirs, files)
. ['1', '2', '3', '4'] []
./1 [] ['a']
./2 [] ['b']
./3 [] ['c']
./4 [] ['d']
>>> for root, dirs, files, fd in os.fwalk('.'):
... dirs.sort()
... print(root, dirs, files)
. ['1', '2', '3', '4'] []
./1 [] ['a']
./2 [] ['b']
./3 [] ['c']
./4 [] ['d'] To introduce an error, force a PermissionError on one of the directories: $ sudo chown root:root 2
$ sudo chmod 700 2 Now, the os.fwalk() results are different (trust me, os.walk() is still okay): >>> for root, dirs, files, fd in os.fwalk('.'):
... dirs.sort()
... print(root, dirs, files)
. ['1', '2', '3', '4'] []
./1 [] ['a'] So it seems that os.fwalk skips remaining directories after an error occurs. The cause of the problem is in this part of os.py: for name in dirs:
try:
orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks)
dirfd = open(name, O_RDONLY, dir_fd=topfd)
except OSError as err:
if onerror is not None:
onerror(err)
break To fix it, simply replace break with continue. Patch attached. Cheers |
LGTM. Here is a patch with tests. |
New changeset 767262c149ca by Serhiy Storchaka in branch '3.5': New changeset a85675dabb8f by Serhiy Storchaka in branch 'default': |
New changeset 7995a81236b6 by Serhiy Storchaka in branch '3.5': New changeset dcf9e9ae5393 by Serhiy Storchaka in branch 'default': |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: