[libvirt] [PATCH 2/3] fdstream: avoid child process leak on error

Eric Blake eblake at redhat.com
Tue Jul 12 19:36:50 UTC 2011


By requesting the pid in virCommandRunAsync, fdstream was claiming
that it would manually wait for the process.  But on the failure
path, the child process was being leaked.

* src/fdstream.c (virFDStreamOpenFileInternal): Auto-reap child.
---
 src/fdstream.c |    8 +-------
 1 files changed, 1 insertions(+), 7 deletions(-)

diff --git a/src/fdstream.c b/src/fdstream.c
index 54f8198..d111813 100644
--- a/src/fdstream.c
+++ b/src/fdstream.c
@@ -31,7 +31,6 @@
 # include <sys/un.h>
 #endif
 #include <netinet/in.h>
-#include <signal.h>

 #include "fdstream.h"
 #include "virterror_internal.h"
@@ -514,7 +513,6 @@ virFDStreamOpenFileInternal(virStreamPtr st,
     struct stat sb;
     virCommandPtr cmd = NULL;
     int errfd = -1;
-    pid_t pid = 0;

     VIR_DEBUG("st=%p path=%s flags=%d offset=%llu length=%llu mode=%d delete=%d",
               st, path, flags, offset, length, mode, delete);
@@ -588,7 +586,7 @@ virFDStreamOpenFileInternal(virStreamPtr st,
         }
         virCommandSetErrorFD(cmd, &errfd);

-        if (virCommandRunAsync(cmd, &pid) < 0)
+        if (virCommandRunAsync(cmd, NULL) < 0)
             goto error;

         VIR_FORCE_CLOSE(childfd);
@@ -611,10 +609,6 @@ virFDStreamOpenFileInternal(virStreamPtr st,
     return 0;

 error:
-#ifndef WIN32
-    if (pid)
-        kill(SIGTERM, pid);
-#endif
     virCommandFree(cmd);
     VIR_FORCE_CLOSE(fds[0]);
     VIR_FORCE_CLOSE(fds[1]);
-- 
1.7.4.4




More information about the libvir-list mailing list