#1608818: errno can get set by every call to readdir().
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index d8c81b6..6af6e51 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -2322,11 +2322,19 @@
 		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 @@
 		}
 		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);