Kaynağa Gözat

ExecFork: Use /proc/self/fd to determine which files to close

This significantly reduces the number of files that have to be closed
and seems to be faster, despite the additional reads.

On systems where /proc/self/fd is not available, we fallback to the
old code that closes all file descriptors >= 3.

Closes: #764204
Julian Andres Klode 11 yıl önce
ebeveyn
işleme
be4d908fb5
1 değiştirilmiş dosya ile 19 ekleme ve 5 silme
  1. 19 5
      apt-pkg/contrib/fileutl.cc

+ 19 - 5
apt-pkg/contrib/fileutl.cc

@@ -800,12 +800,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);
+	 }
       }
    }