New submission from Hynek Schlawack <h...@ox.cx>: I'm implementing a safe rmtree using fwalk. Everything works perfectly except for one thing: if the directory contains dangling symlinks, fwalk goes belly-up:
$ ls -l test/ total 0 lrwxrwxrwx 1 vagrant vagrant 4 May 10 16:36 doesntwork -> this $ ./python Python 3.3.0a3+ (default:b32baa5b7626+, May 10 2012, 14:56:20) [GCC 4.6.3] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import os [71253 refs] >>> list(os.fwalk('test')) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/vagrant/p/Lib/os.py", line 342, in fwalk for x in _fwalk(topfd, top, topdown, onerror, followlinks): File "/home/vagrant/p/Lib/os.py", line 361, in _walk if st.S_ISDIR(fstatat(topfd, name).st_mode): FileNotFoundError: [Errno 2] No such file or directory Unfortunately this makes it impossible to implement rmtree. The reason is the following code: for name in names: # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with # walk() which reports symlinks to directories as directories. We do # however check for symlinks before recursing into a subdirectory. if st.S_ISDIR(fstatat(topfd, name).st_mode): dirs.append(name) else: nondirs.append(name) The "unsafe" walk tree uses os.path.isdir() instead of os.fstatat() and handles this case gracefully. A simple try-except protection with a symlink check fixes it and the tests pass. This is a blocker for #4489. I have expanded the test of the WalkerTests suite. Tested on Linux (= works) and OS X (= skipped). ---------- assignee: hynek components: Library (Lib) files: make-fwalk-handle-dangling-symlinks.diff keywords: patch messages: 160364 nosy: hynek, neologix priority: normal severity: normal stage: patch review status: open title: fwalk breaks on dangling symlinks type: behavior versions: Python 3.3 Added file: http://bugs.python.org/file25523/make-fwalk-handle-dangling-symlinks.diff _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue14773> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com