diff options
author | Michael Vogt <mvo@ubuntu.com> | 2015-10-05 15:21:47 +0200 |
---|---|---|
committer | Michael Vogt <mvo@ubuntu.com> | 2015-10-05 15:21:47 +0200 |
commit | 6f2f5f4afa6f628ad3d068e9ba55fc6455eefa12 (patch) | |
tree | d360bbbdff678c19142facabc46f30f693fe32e9 /apt-pkg/contrib/fileutl.cc | |
parent | 1f5a2d63b784eb919143d0be3f2dee7ff0bb7e83 (diff) | |
parent | 56e47f3111ad714c6506c0d60dccb92cfc9311cb (diff) |
Merge branch 'debian/sid' into ubuntu/master
Diffstat (limited to 'apt-pkg/contrib/fileutl.cc')
-rw-r--r-- | apt-pkg/contrib/fileutl.cc | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc index 1e6d96fe9..6e34f5d28 100644 --- a/apt-pkg/contrib/fileutl.cc +++ b/apt-pkg/contrib/fileutl.cc @@ -778,12 +778,26 @@ pid_t ExecFork(std::set<int> KeepFDs) signal(SIGCONT,SIG_DFL); signal(SIGTSTP,SIG_DFL); - long ScOpenMax = sysconf(_SC_OPEN_MAX); - // Close all of our FDs - just in case - for (int K = 3; K != ScOpenMax; K++) + DIR *dir = opendir("/proc/self/fd"); + if (dir != NULL) { - if(KeepFDs.find(K) == KeepFDs.end()) - fcntl(K,F_SETFD,FD_CLOEXEC); + struct dirent *ent; + while ((ent = readdir(dir))) + { + int fd = atoi(ent->d_name); + // If fd > 0, it was a fd number and not . or .. + if (fd >= 3 && KeepFDs.find(fd) == KeepFDs.end()) + fcntl(fd,F_SETFD,FD_CLOEXEC); + } + closedir(dir); + } else { + long ScOpenMax = sysconf(_SC_OPEN_MAX); + // Close all of our FDs - just in case + for (int K = 3; K != ScOpenMax; K++) + { + if(KeepFDs.find(K) == KeepFDs.end()) + fcntl(K,F_SETFD,FD_CLOEXEC); + } } } |