libroot: Return EBADF if a negative FD is specified to fdopendir.
And do some minor code cleanups. Fixes #19060.
This commit is contained in:
@@ -126,7 +126,10 @@ __create_dir_struct(int fd)
|
|||||||
DIR*
|
DIR*
|
||||||
fdopendir(int fd)
|
fdopendir(int fd)
|
||||||
{
|
{
|
||||||
DIR* dir;
|
if (fd < 0) {
|
||||||
|
__set_errno(EBADF);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// Since our standard file descriptors can't be used as directory file
|
// Since our standard file descriptors can't be used as directory file
|
||||||
// descriptors, we have to open a fresh one explicitly.
|
// descriptors, we have to open a fresh one explicitly.
|
||||||
@@ -140,16 +143,16 @@ fdopendir(int fd)
|
|||||||
// to fdopendir() without changing its state (like for other *at()
|
// to fdopendir() without changing its state (like for other *at()
|
||||||
// functions), we cannot close it now.
|
// functions), we cannot close it now.
|
||||||
// We dup2() the new FD to the previous location instead.
|
// We dup2() the new FD to the previous location instead.
|
||||||
if (dup2(dirFD, fd) == -1)
|
if (dup2(dirFD, fd) == -1) {
|
||||||
close(fd);
|
close(fd);
|
||||||
else {
|
} else {
|
||||||
close(dirFD);
|
close(dirFD);
|
||||||
dirFD = fd;
|
dirFD = fd;
|
||||||
fcntl(dirFD, F_SETFD, FD_CLOEXEC);
|
fcntl(dirFD, F_SETFD, FD_CLOEXEC);
|
||||||
// reset close-on-exec which is cleared by dup()
|
// reset close-on-exec which is cleared by dup()
|
||||||
}
|
}
|
||||||
|
|
||||||
dir = __create_dir_struct(dirFD);
|
DIR* dir = __create_dir_struct(dirFD);
|
||||||
if (dir == NULL) {
|
if (dir == NULL) {
|
||||||
close(dirFD);
|
close(dirFD);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user