Closed
Description
There's a TOCTTOU in LooseObjectDB when storing a new object, that causes storing an object to fail with FileExistsError
:
File "patch_tree.py", line 132, in write_tree
return self.db.store(istream).binsha
File ".venv/lib/python3.9/gitdb/db/git.py", line 77, in store
return self._loose_db.store(istream)
File ".venv/lib/python3.9/gitdb/db/loose.py", line 226, in store
mkdir(obj_dir)
FileExistsError: [Errno 17] File exists: '/tmp/tmp.flUcclypOQ/objects/a0'
if not isdir(obj_dir):
mkdir(obj_dir)
and what is happening is
isdir()
returnsFalse
because the directory does not exist at that moment- The directory is created in another thread
mkdir()
fails withFileExistsError
This can be avoided by using an EAFP pattern, e.g.
with contextlib.suppress(FileExistsError):
mkdir(obj_dir)