-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Prevent unintended file desriptor leak in grantpt.
The pt_chown program is completely transparently called. It might not be able to live with the various file descriptors the program has open at the time of the call (e.g., under SELinux). Close all but the needed descriptor and connect stdin, stdout, and stderr with /dev/null. pt_chown shouldn't print anything when called to do real work. (cherry picked from commit 139ee08)
- Loading branch information
Ulrich Drepper
authored and
Petr Baudis
committed
Dec 4, 2009
1 parent
4f9d265
commit 65a27b0
Showing
4 changed files
with
54 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
#include <assert.h> | ||
#include <ctype.h> | ||
#include <dirent.h> | ||
#include <errno.h> | ||
#include <fcntl.h> | ||
#include <paths.h> | ||
#include <stdlib.h> | ||
#include <unistd.h> | ||
|
||
#include "not-cancel.h" | ||
#include "pty-private.h" | ||
|
||
|
||
/* Close all file descriptors except the one specified. */ | ||
static void | ||
close_all_fds (void) | ||
{ | ||
DIR *dir = opendir ("/proc/self/fd"); | ||
if (dir != NULL) | ||
{ | ||
struct dirent64 *d; | ||
while ((d = readdir64 (dir)) != NULL) | ||
if (isdigit (d->d_name[0])) | ||
{ | ||
char *endp; | ||
long int fd = strtol (d->d_name, &endp, 10); | ||
if (*endp == '\0' && fd != PTY_FILENO && fd != dirfd (dir)) | ||
close_not_cancel_no_status (fd); | ||
} | ||
|
||
closedir (dir); | ||
|
||
int nullfd = open_not_cancel_2 (_PATH_DEVNULL, O_RDONLY); | ||
assert (nullfd == STDIN_FILENO); | ||
nullfd = open_not_cancel_2 (_PATH_DEVNULL, O_WRONLY); | ||
assert (nullfd == STDOUT_FILENO); | ||
__dup2 (STDOUT_FILENO, STDERR_FILENO); | ||
} | ||
} | ||
#define CLOSE_ALL_FDS() close_all_fds() | ||
|
||
#include <sysdeps/unix/grantpt.c> |