diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -454,14 +454,22 @@ @unittest.skipUnless(hasattr(posix, 'fdlistdir'), "test needs posix.fdlistdir()") def test_fdlistdir(self): f = posix.open(posix.getcwd(), posix.O_RDONLY) + self.addCleanup(posix.close, f) + f1 = posix.dup(f) self.assertEqual( sorted(posix.listdir('.')), - sorted(posix.fdlistdir(f)) + sorted(posix.fdlistdir(f1)) ) # Check the fd was closed by fdlistdir with self.assertRaises(OSError) as ctx: - posix.close(f) + posix.close(f1) self.assertEqual(ctx.exception.errno, errno.EBADF) + # Check that the fd offset was reset (issue #XXXX) + f2 = posix.dup(f) + self.assertEqual( + sorted(posix.listdir('.')), + sorted(posix.fdlistdir(f2)) + ) def test_access(self): if hasattr(posix, 'access'): diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -2906,6 +2906,7 @@ break; } else { Py_BEGIN_ALLOW_THREADS + rewinddir(dirp); closedir(dirp); Py_END_ALLOW_THREADS Py_DECREF(d); @@ -2929,6 +2930,7 @@ Py_DECREF(v); } Py_BEGIN_ALLOW_THREADS + rewinddir(dirp); closedir(dirp); Py_END_ALLOW_THREADS