diff options
author | Berker Peksag <berker.peksag@gmail.com> | 2014-12-10 00:50:32 (GMT) |
---|---|---|
committer | Berker Peksag <berker.peksag@gmail.com> | 2014-12-10 00:50:32 (GMT) |
commit | 884afd92f5a194e326df2be8279d4ab160c7b0c9 (patch) | |
tree | ce04f35703ae8e49f7795ea92cfad63047126041 /Lib/test | |
parent | 8b1cbd2b7cd8752462c68b17447446b54065691c (diff) | |
download | cpython-884afd92f5a194e326df2be8279d4ab160c7b0c9.zip cpython-884afd92f5a194e326df2be8279d4ab160c7b0c9.tar.gz cpython-884afd92f5a194e326df2be8279d4ab160c7b0c9.tar.bz2 |
Issue #21775: shutil.copytree(): fix crash when copying to VFAT
An exception handler assumed that that OSError objects always have a
'winerror' attribute. That is not the case, so the exception handler
itself raised AttributeError when run on Linux (and, presumably, any
other non-Windows OS).
Patch by Greg Ward.
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_shutil.py | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 3490362..9325bc7 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -1,6 +1,7 @@ # Copyright (C) 2003 Python Software Foundation import unittest +import unittest.mock import shutil import tempfile import sys @@ -758,6 +759,20 @@ class TestShutil(unittest.TestCase): self.assertEqual(os.stat(restrictive_subdir).st_mode, os.stat(restrictive_subdir_dst).st_mode) + @unittest.mock.patch('os.chmod') + def test_copytree_winerror(self, mock_patch): + # When copying to VFAT, copystat() raises OSError. On Windows, the + # exception object has a meaningful 'winerror' attribute, but not + # on other operating systems. Do not assume 'winerror' is set. + src_dir = tempfile.mkdtemp() + dst_dir = os.path.join(tempfile.mkdtemp(), 'destination') + self.addCleanup(shutil.rmtree, src_dir) + self.addCleanup(shutil.rmtree, os.path.dirname(dst_dir)) + + mock_patch.side_effect = PermissionError('ka-boom') + with self.assertRaises(shutil.Error): + shutil.copytree(src_dir, dst_dir) + @unittest.skipIf(os.name == 'nt', 'temporarily disabled on Windows') @unittest.skipUnless(hasattr(os, 'link'), 'requires os.link') def test_dont_copy_file_onto_link_to_itself(self): |