Issue #13739: In os.listdir(), rewind the directory stream (so that listdir()

can be called again on the same open file).
parent c0702167
...@@ -454,14 +454,22 @@ class PosixTester(unittest.TestCase): ...@@ -454,14 +454,22 @@ class PosixTester(unittest.TestCase):
@unittest.skipUnless(hasattr(posix, 'fdlistdir'), "test needs posix.fdlistdir()") @unittest.skipUnless(hasattr(posix, 'fdlistdir'), "test needs posix.fdlistdir()")
def test_fdlistdir(self): def test_fdlistdir(self):
f = posix.open(posix.getcwd(), posix.O_RDONLY) f = posix.open(posix.getcwd(), posix.O_RDONLY)
self.addCleanup(posix.close, f)
f1 = posix.dup(f)
self.assertEqual( self.assertEqual(
sorted(posix.listdir('.')), sorted(posix.listdir('.')),
sorted(posix.fdlistdir(f)) sorted(posix.fdlistdir(f1))
) )
# Check the fd was closed by fdlistdir # Check the fd was closed by fdlistdir
with self.assertRaises(OSError) as ctx: with self.assertRaises(OSError) as ctx:
posix.close(f) posix.close(f1)
self.assertEqual(ctx.exception.errno, errno.EBADF) self.assertEqual(ctx.exception.errno, errno.EBADF)
# Check that the fd offset was reset (issue #13739)
f2 = posix.dup(f)
self.assertEqual(
sorted(posix.listdir('.')),
sorted(posix.fdlistdir(f2))
)
def test_access(self): def test_access(self):
if hasattr(posix, 'access'): if hasattr(posix, 'access'):
......
...@@ -2906,6 +2906,7 @@ posix_fdlistdir(PyObject *self, PyObject *args) ...@@ -2906,6 +2906,7 @@ posix_fdlistdir(PyObject *self, PyObject *args)
break; break;
} else { } else {
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
rewinddir(dirp);
closedir(dirp); closedir(dirp);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
Py_DECREF(d); Py_DECREF(d);
...@@ -2929,6 +2930,7 @@ posix_fdlistdir(PyObject *self, PyObject *args) ...@@ -2929,6 +2930,7 @@ posix_fdlistdir(PyObject *self, PyObject *args)
Py_DECREF(v); Py_DECREF(v);
} }
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
rewinddir(dirp);
closedir(dirp); closedir(dirp);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment