This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On Fri, Dec 22, 2017 at 08:31:01PM +0100, Aurelien Jarno wrote: > 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. > --- > ChangeLog | 6 ++++++ > dirent/scandir-tail.c | 13 ++++++++----- > 2 files changed, 14 insertions(+), 5 deletions(-) > > diff --git a/ChangeLog b/ChangeLog > index 8368b3006d..713c5ade6d 100644 > --- a/ChangeLog > +++ b/ChangeLog > @@ -1,3 +1,9 @@ > +2017-12-22 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-22 Zack Weinberg <zackw@panix.com> > > [BZ #22615] > diff --git a/dirent/scandir-tail.c b/dirent/scandir-tail.c > index 068c644c4e..927791fad0 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 need to be again to s/it need to be/it needs to be/ > + 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 need to be again to make the latter tests work. */ Likewise. > + __set_errno (0); > } > > if (__glibc_likely (errno == 0)) Besides these two typos in comments, the patch is fine. -- ldv
Attachment:
signature.asc
Description: PGP signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |