diff options
author | Johannes Gijsbers <jlg@dds.nl> | 2004-08-14 13:30:02 +0000 |
---|---|---|
committer | Johannes Gijsbers <jlg@dds.nl> | 2004-08-14 13:30:02 +0000 |
commit | ba4742597144c3cfcd44873756ba07ba08126b84 (patch) | |
tree | 5a58e11572cbfebd7515770e64db107beb742611 /Lib/shutil.py | |
parent | f3f8c2ba2413a7995dd4a43f3ad240fd31afc4bb (diff) | |
download | cpython-ba4742597144c3cfcd44873756ba07ba08126b84.tar.gz |
Raise an exception when src and dst refer to the same file via a hard link or a
symbolic link (bug #851123 / patch #854853, thanks Gregory Ball).
Diffstat (limited to 'Lib/shutil.py')
-rw-r--r-- | Lib/shutil.py | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/Lib/shutil.py b/Lib/shutil.py index fde8c90fe9..d361fa2b5d 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -24,16 +24,22 @@ def copyfileobj(fsrc, fdst, length=16*1024): break fdst.write(buf) +def _samefile(src, dst): + # Macintosh, Unix. + if hasattr(os.path,'samefile'): + return os.path.samefile(src, dst) + + # All other platforms: check for same pathname. + return (os.path.normcase(os.path.abspath(src)) == + os.path.normcase(os.path.abspath(dst))) def copyfile(src, dst): """Copy data from src to dst""" + if _samefile(src, dst): + raise Error, "`%s` and `%s` are the same file" % (src, dst) + fsrc = None fdst = None - # check for same pathname; all platforms - _src = os.path.normcase(os.path.abspath(src)) - _dst = os.path.normcase(os.path.abspath(dst)) - if _src == _dst: - return try: fsrc = open(src, 'rb') fdst = open(dst, 'wb') |