]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: Make it safe to call virFileWrapperFdClose() multiple times
authorAndrea Bolognani <abologna@redhat.com>
Tue, 19 Feb 2019 15:58:27 +0000 (16:58 +0100)
committerAndrea Bolognani <abologna@redhat.com>
Mon, 25 Feb 2019 15:34:22 +0000 (16:34 +0100)
We'll want to use this function in the cleanup path soon,
and in order to be able to do that we need to make sure we
can call it multiple times on the same virFileWrapperFd
without side effects.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/util/virfile.c

index 271bf5e796c1a8fdedac4585a7d6e1da960b219e..42add5a2cdd0af4a8ed4e5566e474b4e6dc3ae81 100644 (file)
@@ -175,6 +175,7 @@ virFileDirectFdFlag(void)
 /* Opaque type for managing a wrapper around a fd.  For now,
  * read-write is not supported, just a single direction.  */
 struct _virFileWrapperFd {
+    bool closed; /* Whether virFileWrapperFdClose() has been already called */
     virCommandPtr cmd; /* Child iohelper process to do the I/O.  */
     char *err_msg; /* stderr of @cmd */
 };
@@ -323,16 +324,21 @@ virFileWrapperFdNew(int *fd ATTRIBUTE_UNUSED,
  * callers can conditionally create a virFileWrapperFd wrapper but
  * unconditionally call the cleanup code.  To avoid deadlock, only
  * call this after closing the fd resulting from virFileWrapperFdNew().
+ *
+ * This function can be safely called multiple times on the same @wfd.
  */
 int
 virFileWrapperFdClose(virFileWrapperFdPtr wfd)
 {
     int ret;
 
-    if (!wfd)
+    if (!wfd || wfd->closed)
         return 0;
 
     ret = virCommandWait(wfd->cmd, NULL);
+
+    wfd->closed = true;
+
     return ret;
 }