fts_children: preserve errno after running close/fchdir
PR: 200942 Submitted by: Conrad Meyer Differential Revision: https://reviews.freebsd.org/D2852 MFC after: 1 week
This commit is contained in:
parent
7705435606
commit
764a9bbee1
@ -515,7 +515,7 @@ FTSENT *
|
||||
fts_children(FTS *sp, int instr)
|
||||
{
|
||||
FTSENT *p;
|
||||
int fd;
|
||||
int fd, rc, serrno;
|
||||
|
||||
if (instr != 0 && instr != FTS_NAMEONLY) {
|
||||
errno = EINVAL;
|
||||
@ -571,11 +571,14 @@ fts_children(FTS *sp, int instr)
|
||||
if ((fd = _open(".", O_RDONLY | O_CLOEXEC, 0)) < 0)
|
||||
return (NULL);
|
||||
sp->fts_child = fts_build(sp, instr);
|
||||
if (fchdir(fd)) {
|
||||
(void)_close(fd);
|
||||
return (NULL);
|
||||
}
|
||||
serrno = (sp->fts_child == NULL) ? errno : 0;
|
||||
rc = fchdir(fd);
|
||||
if (rc < 0 && serrno == 0)
|
||||
serrno = errno;
|
||||
(void)_close(fd);
|
||||
errno = serrno;
|
||||
if (rc < 0)
|
||||
return (NULL);
|
||||
return (sp->fts_child);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user