gh-74585: Fix race condition in shutil.copyfile #136836
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR fixes a race condition in
shutil.copyfile(there are several othershutilfunctions that should also be fixed. The current state is that onlycopyfileis fixed.) Unittests are passing but there are a few things that I'd like to look into:Reading through the issue, the following questions were asked and should be looked into:
copyfilechanges for operations that are duplicated/should be done inside of the openers. For instance, this PR presently stats a file twice. I think that's unnecessary.intand then return an instance of the subclass fromdst_openerwith adst_was_createdattribute set. I don't think this makes the code any cleaner than it is now. If there's some other reason anonlocalvariable won't work in later revisions of the code, this is a strategy that can be explored.open()is needed instead of simply implementing an opener forsrcanddst. With that being the case, we can probably movedst_was_createdinto there.shutilfunctions: giampaulo:All copy* functions and move() are subjects to race conditions (the only exception is rmtree()).copyfileis good in and of itself, regardless of whether we fix the rest of theshutilfunctions. I'll take a look at how similar they are before commenting on this.This is a forward-port of #1659 from @pkmoore