mirror of
https://github.com/python/cpython.git
synced 2025-10-22 09:23:54 +00:00
bpo-33721: Make some os.path functions and pathlib.Path methods be tolerant to invalid paths. (#7695)
Such functions as os.path.exists(), os.path.lexists(), os.path.isdir(), os.path.isfile(), os.path.islink(), and os.path.ismount() now return False instead of raising ValueError or its subclasses UnicodeEncodeError and UnicodeDecodeError for paths that contain characters or bytes unrepresentative at the OS level.
This commit is contained in:
parent
7bdf28265a
commit
0185f34ddc
15 changed files with 181 additions and 54 deletions
|
@ -1342,6 +1342,8 @@ def test_exists(self):
|
|||
self.assertIs(False, (p / 'linkA' / 'bah').exists())
|
||||
self.assertIs(False, (p / 'foo').exists())
|
||||
self.assertIs(False, P('/xyzzy').exists())
|
||||
self.assertIs(False, P(BASE + '\udfff').exists())
|
||||
self.assertIs(False, P(BASE + '\x00').exists())
|
||||
|
||||
def test_open_common(self):
|
||||
p = self.cls(BASE)
|
||||
|
@ -1866,7 +1868,9 @@ def test_is_dir(self):
|
|||
if support.can_symlink():
|
||||
self.assertFalse((P / 'linkA').is_dir())
|
||||
self.assertTrue((P / 'linkB').is_dir())
|
||||
self.assertFalse((P/ 'brokenLink').is_dir())
|
||||
self.assertFalse((P/ 'brokenLink').is_dir(), False)
|
||||
self.assertIs((P / 'dirA\udfff').is_dir(), False)
|
||||
self.assertIs((P / 'dirA\x00').is_dir(), False)
|
||||
|
||||
def test_is_file(self):
|
||||
P = self.cls(BASE)
|
||||
|
@ -1878,6 +1882,8 @@ def test_is_file(self):
|
|||
self.assertTrue((P / 'linkA').is_file())
|
||||
self.assertFalse((P / 'linkB').is_file())
|
||||
self.assertFalse((P/ 'brokenLink').is_file())
|
||||
self.assertIs((P / 'fileA\udfff').is_file(), False)
|
||||
self.assertIs((P / 'fileA\x00').is_file(), False)
|
||||
|
||||
@only_posix
|
||||
def test_is_mount(self):
|
||||
|
@ -1890,6 +1896,8 @@ def test_is_mount(self):
|
|||
self.assertTrue(R.is_mount())
|
||||
if support.can_symlink():
|
||||
self.assertFalse((P / 'linkA').is_mount())
|
||||
self.assertIs(self.cls('/\udfff').is_mount(), False)
|
||||
self.assertIs(self.cls('/\x00').is_mount(), False)
|
||||
|
||||
def test_is_symlink(self):
|
||||
P = self.cls(BASE)
|
||||
|
@ -1901,6 +1909,11 @@ def test_is_symlink(self):
|
|||
self.assertTrue((P / 'linkA').is_symlink())
|
||||
self.assertTrue((P / 'linkB').is_symlink())
|
||||
self.assertTrue((P/ 'brokenLink').is_symlink())
|
||||
self.assertIs((P / 'fileA\udfff').is_file(), False)
|
||||
self.assertIs((P / 'fileA\x00').is_file(), False)
|
||||
if support.can_symlink():
|
||||
self.assertIs((P / 'linkA\udfff').is_file(), False)
|
||||
self.assertIs((P / 'linkA\x00').is_file(), False)
|
||||
|
||||
def test_is_fifo_false(self):
|
||||
P = self.cls(BASE)
|
||||
|
@ -1908,6 +1921,8 @@ def test_is_fifo_false(self):
|
|||
self.assertFalse((P / 'dirA').is_fifo())
|
||||
self.assertFalse((P / 'non-existing').is_fifo())
|
||||
self.assertFalse((P / 'fileA' / 'bah').is_fifo())
|
||||
self.assertIs((P / 'fileA\udfff').is_fifo(), False)
|
||||
self.assertIs((P / 'fileA\x00').is_fifo(), False)
|
||||
|
||||
@unittest.skipUnless(hasattr(os, "mkfifo"), "os.mkfifo() required")
|
||||
def test_is_fifo_true(self):
|
||||
|
@ -1919,6 +1934,8 @@ def test_is_fifo_true(self):
|
|||
self.assertTrue(P.is_fifo())
|
||||
self.assertFalse(P.is_socket())
|
||||
self.assertFalse(P.is_file())
|
||||
self.assertIs(self.cls(BASE, 'myfifo\udfff').is_fifo(), False)
|
||||
self.assertIs(self.cls(BASE, 'myfifo\x00').is_fifo(), False)
|
||||
|
||||
def test_is_socket_false(self):
|
||||
P = self.cls(BASE)
|
||||
|
@ -1926,6 +1943,8 @@ def test_is_socket_false(self):
|
|||
self.assertFalse((P / 'dirA').is_socket())
|
||||
self.assertFalse((P / 'non-existing').is_socket())
|
||||
self.assertFalse((P / 'fileA' / 'bah').is_socket())
|
||||
self.assertIs((P / 'fileA\udfff').is_socket(), False)
|
||||
self.assertIs((P / 'fileA\x00').is_socket(), False)
|
||||
|
||||
@unittest.skipUnless(hasattr(socket, "AF_UNIX"), "Unix sockets required")
|
||||
def test_is_socket_true(self):
|
||||
|
@ -1941,6 +1960,8 @@ def test_is_socket_true(self):
|
|||
self.assertTrue(P.is_socket())
|
||||
self.assertFalse(P.is_fifo())
|
||||
self.assertFalse(P.is_file())
|
||||
self.assertIs(self.cls(BASE, 'mysock\udfff').is_socket(), False)
|
||||
self.assertIs(self.cls(BASE, 'mysock\x00').is_socket(), False)
|
||||
|
||||
def test_is_block_device_false(self):
|
||||
P = self.cls(BASE)
|
||||
|
@ -1948,6 +1969,8 @@ def test_is_block_device_false(self):
|
|||
self.assertFalse((P / 'dirA').is_block_device())
|
||||
self.assertFalse((P / 'non-existing').is_block_device())
|
||||
self.assertFalse((P / 'fileA' / 'bah').is_block_device())
|
||||
self.assertIs((P / 'fileA\udfff').is_block_device(), False)
|
||||
self.assertIs((P / 'fileA\x00').is_block_device(), False)
|
||||
|
||||
def test_is_char_device_false(self):
|
||||
P = self.cls(BASE)
|
||||
|
@ -1955,6 +1978,8 @@ def test_is_char_device_false(self):
|
|||
self.assertFalse((P / 'dirA').is_char_device())
|
||||
self.assertFalse((P / 'non-existing').is_char_device())
|
||||
self.assertFalse((P / 'fileA' / 'bah').is_char_device())
|
||||
self.assertIs((P / 'fileA\udfff').is_char_device(), False)
|
||||
self.assertIs((P / 'fileA\x00').is_char_device(), False)
|
||||
|
||||
def test_is_char_device_true(self):
|
||||
# Under Unix, /dev/null should generally be a char device
|
||||
|
@ -1964,6 +1989,8 @@ def test_is_char_device_true(self):
|
|||
self.assertTrue(P.is_char_device())
|
||||
self.assertFalse(P.is_block_device())
|
||||
self.assertFalse(P.is_file())
|
||||
self.assertIs(self.cls('/dev/null\udfff').is_char_device(), False)
|
||||
self.assertIs(self.cls('/dev/null\x00').is_char_device(), False)
|
||||
|
||||
def test_pickling_common(self):
|
||||
p = self.cls(BASE, 'fileA')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue