* Replace the FD used for fopendir() instead of closing the old one - according
to the specs, the application may still use the FD without changing its state, and only closedir() should finally close it. * This fixes bug #5055. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34362 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -133,18 +133,25 @@ fdopendir(int fd)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Since applications are allowed to use the file descriptor after a call
|
||||||
|
// to fdopendir() without changing its state (like for other *at()
|
||||||
|
// functions), we cannot close it now.
|
||||||
|
// We dup2() the new FD to the previous location instead.
|
||||||
|
if (dup2(dirFD, fd) == -1)
|
||||||
|
close(fd);
|
||||||
|
else {
|
||||||
|
close(dirFD);
|
||||||
|
dirFD = fd;
|
||||||
|
fcntl(dirFD, F_SETFD, FD_CLOEXEC);
|
||||||
|
// reset close-on-exec which is cleared by dup()
|
||||||
|
}
|
||||||
|
|
||||||
dir = __create_dir_struct(dirFD);
|
dir = __create_dir_struct(dirFD);
|
||||||
if (dir == NULL) {
|
if (dir == NULL) {
|
||||||
close(dirFD);
|
close(dirFD);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// According to the spec, "the file descriptor is under the control of the
|
|
||||||
// system" now. It's not quite clear whether we're allowed to close it now,
|
|
||||||
// though. We could dup2() the new FD over the old one and close the new
|
|
||||||
// one, if it turns out to be a problem.
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
return dir;
|
return dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user