scandir: fix wrong assumption about errno [BZ #17804]

malloc and realloc may set errno to ENOMEM even if they are successful.
The scandir code wrongly assume that they do not change errno, this
causes scandir to fail with ENOMEM even if malloc succeed.

The code already handles that readdir might set errno by calling
__set_errno (0) to clear the error. Move that part at the end of the
loop to also take malloc and realloc into account.

Changelog:
	[BZ #17804]
	* dirent/scandir-tail.c (SCANDIR_TAIL): Move __set_errno (0) at the
	end of the loop. Improve comments.
This commit is contained in:
Aurelien Jarno 2017-12-29 14:44:57 +01:00
parent 54e4efc287
commit 72f29e3aab
2 changed files with 14 additions and 5 deletions

View File

@ -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]

View File

@ -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))