aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--dirent/scandir-tail.c13
2 files changed, 14 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index f87bc14690..fd9a8dd2f5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2017-12-29 Aurelien Jarno <aurelien@aurel32.net>
+
+ [BZ #17804]
+ * dirent/scandir-tail.c (SCANDIR_TAIL): Move __set_errno (0) at the
+ end of the loop. Improve comments.
+
2017-12-29 Zack Weinberg <zackw@panix.com>
[BZ #22615]
diff --git a/dirent/scandir-tail.c b/dirent/scandir-tail.c
index 068c644c4e..a02c99a828 100644
--- a/dirent/scandir-tail.c
+++ b/dirent/scandir-tail.c
@@ -53,16 +53,14 @@ SCANDIR_TAIL (DIR *dp,
{
int selected = (*select) (d);
- /* The SELECT function might have changed errno. It was
- zero before and it need to be again to make the later
- tests work. */
+ /* The SELECT function might have set errno to non-zero on
+ success. It was zero before and it needs to be again to
+ make the later tests work. */
__set_errno (0);
if (!selected)
continue;
}
- else
- __set_errno (0);
if (__glibc_unlikely (c.cnt == vsize))
{
@@ -81,6 +79,11 @@ SCANDIR_TAIL (DIR *dp,
if (vnew == NULL)
break;
v[c.cnt++] = (DIRENT_TYPE *) memcpy (vnew, d, dsize);
+
+ /* Ignore errors from readdir, malloc or realloc. These functions
+ might have set errno to non-zero on success. It was zero before
+ and it needs to be again to make the latter tests work. */
+ __set_errno (0);
}
if (__glibc_likely (errno == 0))