Creating a function for a directory
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Mon Nov 11 19:33:35 EST 2013
On Mon, 11 Nov 2013 14:51:45 -0800, Rick Johnson wrote:
> 2. Never, ever, *EVER* write data to disc before confirming the paths
> your passing are pointing to the location you intended to write the
> data. Use os.path.exists(path) to test your paths BEFORE trying to write
> data.
This is subject to a race condition, which opens you to a security
vulnerability: "time of check to time of use" bugs.
If you follow Rick's advice, and write code like this:
if os.path.exists(path):
write_to(path) # custom function to open and write to the file
else:
handle_missing_file()
your code is doubly buggy. First, os.path.exists only tells you if the
path exists, not whether it is writable. Perhaps it is on read-only
media, or you don't have permission to open it, or it's a directory.
Secondly, even if the file exists at the moment you call os.path.exists,
there is no guarantee that it will still exist a moment later when you
try writing to it. Another process may delete or rename the file, or
change permissions in the meantime. So you have to write:
if os.path.exists(path):
try:
write_to(path)
except (IOError, OSError):
handle_missing_or_locked_file()
else:
handle_missing_or_locked_file()
But now your test doesn't actually accomplish anything. Worse, just
because the path *doesn't* exist when you check using exists, that
doesn't mean it won't exist by the time you call write_to!
Using os.path.exists before opening a file is, for the most part, a waste
of time.
--
Steven
More information about the Python-list
mailing list