mirror of https://github.com/python/cpython.git
#1608818: errno can get set by every call to readdir().
This commit is contained in:
parent
b32dea5a3e
commit
86cbf81b47
|
@ -63,6 +63,8 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #1608818: Fix misbehavior in os.listdir() if readdir() fails.
|
||||
|
||||
- Issue #3125: Remove copy_reg in multiprocessing and replace it with
|
||||
ForkingPickler.register() to resolve conflict with ctypes.
|
||||
|
||||
|
|
|
@ -2322,11 +2322,19 @@ posix_listdir(PyObject *self, PyObject *args)
|
|||
return NULL;
|
||||
}
|
||||
for (;;) {
|
||||
errno = 0;
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
ep = readdir(dirp);
|
||||
Py_END_ALLOW_THREADS
|
||||
if (ep == NULL)
|
||||
break;
|
||||
if (ep == NULL) {
|
||||
if (errno == 0) {
|
||||
break;
|
||||
} else {
|
||||
closedir(dirp);
|
||||
Py_DECREF(d);
|
||||
return posix_error_with_allocated_filename(name);
|
||||
}
|
||||
}
|
||||
if (ep->d_name[0] == '.' &&
|
||||
(NAMLEN(ep) == 1 ||
|
||||
(ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
|
||||
|
@ -2363,12 +2371,6 @@ posix_listdir(PyObject *self, PyObject *args)
|
|||
}
|
||||
Py_DECREF(v);
|
||||
}
|
||||
if (errno != 0 && d != NULL) {
|
||||
/* readdir() returned NULL and set errno */
|
||||
closedir(dirp);
|
||||
Py_DECREF(d);
|
||||
return posix_error_with_allocated_filename(name);
|
||||
}
|
||||
closedir(dirp);
|
||||
PyMem_Free(name);
|
||||
|
||||
|
|
Loading…
Reference in New Issue