mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-39327: Close file descriptors as soon as possible in shutil.rmtree (GH-31384)
It fixes the "Text File Busy" OSError when using 'rmtree' on a
windows-managed filesystem in via the VirtualBox shared folder
(and possible other scenarios like a windows-managed network file
system).
(cherry picked from commit b77158b4da
)
Co-authored-by: Lital Natan <litaln@gmail.com>
This commit is contained in:
parent
e7115d5363
commit
959846be52
3 changed files with 13 additions and 2 deletions
|
@ -656,6 +656,7 @@ def _rmtree_safe_fd(topfd, path, onerror):
|
|||
if is_dir:
|
||||
try:
|
||||
dirfd = os.open(entry.name, os.O_RDONLY, dir_fd=topfd)
|
||||
dirfd_closed = False
|
||||
except OSError:
|
||||
onerror(os.open, fullname, sys.exc_info())
|
||||
else:
|
||||
|
@ -663,6 +664,8 @@ def _rmtree_safe_fd(topfd, path, onerror):
|
|||
if os.path.samestat(orig_st, os.fstat(dirfd)):
|
||||
_rmtree_safe_fd(dirfd, fullname, onerror)
|
||||
try:
|
||||
os.close(dirfd)
|
||||
dirfd_closed = True
|
||||
os.rmdir(entry.name, dir_fd=topfd)
|
||||
except OSError:
|
||||
onerror(os.rmdir, fullname, sys.exc_info())
|
||||
|
@ -676,7 +679,8 @@ def _rmtree_safe_fd(topfd, path, onerror):
|
|||
except OSError:
|
||||
onerror(os.path.islink, fullname, sys.exc_info())
|
||||
finally:
|
||||
os.close(dirfd)
|
||||
if not dirfd_closed:
|
||||
os.close(dirfd)
|
||||
else:
|
||||
try:
|
||||
os.unlink(entry.name, dir_fd=topfd)
|
||||
|
@ -719,6 +723,7 @@ def rmtree(path, ignore_errors=False, onerror=None):
|
|||
return
|
||||
try:
|
||||
fd = os.open(path, os.O_RDONLY)
|
||||
fd_closed = False
|
||||
except Exception:
|
||||
onerror(os.open, path, sys.exc_info())
|
||||
return
|
||||
|
@ -726,6 +731,8 @@ def rmtree(path, ignore_errors=False, onerror=None):
|
|||
if os.path.samestat(orig_st, os.fstat(fd)):
|
||||
_rmtree_safe_fd(fd, path, onerror)
|
||||
try:
|
||||
os.close(fd)
|
||||
fd_closed = True
|
||||
os.rmdir(path)
|
||||
except OSError:
|
||||
onerror(os.rmdir, path, sys.exc_info())
|
||||
|
@ -736,7 +743,8 @@ def rmtree(path, ignore_errors=False, onerror=None):
|
|||
except OSError:
|
||||
onerror(os.path.islink, path, sys.exc_info())
|
||||
finally:
|
||||
os.close(fd)
|
||||
if not fd_closed:
|
||||
os.close(fd)
|
||||
else:
|
||||
try:
|
||||
if _rmtree_islink(path):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue