]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
Merge remote-tracking branch 'gkurz/tags/for-upstream' into staging
authorStefan Hajnoczi <stefanha@redhat.com>
Thu, 24 Nov 2016 10:16:23 +0000 (10:16 +0000)
committerStefan Hajnoczi <stefanha@redhat.com>
Thu, 24 Nov 2016 10:16:23 +0000 (10:16 +0000)
This pull request fixes some leaks (memory, fd) in the handle and proxy
backends.

 # gpg: Signature made Wed 23 Nov 2016 12:53:41 PM GMT
 # gpg:                using DSA key 0x02FC3AEB0101DBC2
 # gpg: Good signature from "Greg Kurz <groug@kaod.org>"
 # gpg:                 aka "Greg Kurz <groug@free.fr>"
 # gpg:                 aka "Greg Kurz <gkurz@fr.ibm.com>"
 # gpg:                 aka "Greg Kurz <gkurz@linux.vnet.ibm.com>"
 # gpg:                 aka "Gregory Kurz (Groug) <groug@free.fr>"
 # gpg:                 aka "Gregory Kurz (Cimai Technology) <gkurz@cimai.com>"
 # gpg:                 aka "Gregory Kurz (Meiosys Technology) <gkurz@meiosys.com>"
 # gpg: WARNING: This key is not certified with a trusted signature!
 # gpg:          There is no indication that the signature belongs to the owner.
 # Primary key fingerprint: 2BD4 3B44 535E C0A7 9894  DBA2 02FC 3AEB 0101 DBC2

* gkurz/tags/for-upstream:
  9pfs: add cleanup operation for proxy backend driver
  9pfs: add cleanup operation for handle backend driver
  9pfs: add cleanup operation in FileOperations
  9pfs: adjust the order of resource cleanup in device unrealize

Message-id: 1479920298-24983-1-git-send-email-groug@kaod.org
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
fsdev/file-op-9p.h
hw/9pfs/9p-handle.c
hw/9pfs/9p-proxy.c
hw/9pfs/9p.c

index 6db9feac8f1c8a00f162c386629882bd179f00c5..a56dc8488dfceea250014ee6fd9b20733606166b 100644 (file)
@@ -100,6 +100,7 @@ struct FileOperations
 {
     int (*parse_opts)(QemuOpts *, struct FsDriverEntry *);
     int (*init)(struct FsContext *);
+    void (*cleanup)(struct FsContext *);
     int (*lstat)(FsContext *, V9fsPath *, struct stat *);
     ssize_t (*readlink)(FsContext *, V9fsPath *, char *, size_t);
     int (*chmod)(FsContext *, V9fsPath *, FsCred *);
index 3d77594f92451f77667e33e2c6d6f441db02cf8f..1687661bc95aeb7c583a35283d27e51572af50dc 100644 (file)
@@ -649,6 +649,14 @@ out:
     return ret;
 }
 
+static void handle_cleanup(FsContext *ctx)
+{
+    struct handle_data *data = ctx->private;
+
+    close(data->mountfd);
+    g_free(data);
+}
+
 static int handle_parse_opts(QemuOpts *opts, struct FsDriverEntry *fse)
 {
     const char *sec_model = qemu_opt_get(opts, "security_model");
@@ -671,6 +679,7 @@ static int handle_parse_opts(QemuOpts *opts, struct FsDriverEntry *fse)
 FileOperations handle_ops = {
     .parse_opts   = handle_parse_opts,
     .init         = handle_init,
+    .cleanup      = handle_cleanup,
     .lstat        = handle_lstat,
     .readlink     = handle_readlink,
     .close        = handle_close,
index f2417b7fd73d3958bfd3a470b951f5adf4a057ee..f4aa7a9d70f8f4b35f0f1fdbe26c86c88ec4e7a4 100644 (file)
@@ -1168,9 +1168,22 @@ static int proxy_init(FsContext *ctx)
     return 0;
 }
 
+static void proxy_cleanup(FsContext *ctx)
+{
+    V9fsProxy *proxy = ctx->private;
+
+    g_free(proxy->out_iovec.iov_base);
+    g_free(proxy->in_iovec.iov_base);
+    if (ctx->export_flags & V9FS_PROXY_SOCK_NAME) {
+        close(proxy->sockfd);
+    }
+    g_free(proxy);
+}
+
 FileOperations proxy_ops = {
     .parse_opts   = proxy_parse_opts,
     .init         = proxy_init,
+    .cleanup      = proxy_cleanup,
     .lstat        = proxy_lstat,
     .readlink     = proxy_readlink,
     .close        = proxy_close,
index aea7e9d392061edbea2b4375d879ed5a123ea0a0..faebd91f5fab85384d8c9a73a4533c5c40c038f8 100644 (file)
@@ -3521,8 +3521,11 @@ int v9fs_device_realize_common(V9fsState *s, Error **errp)
     rc = 0;
 out:
     if (rc) {
-        g_free(s->ctx.fs_root);
+        if (s->ops->cleanup && s->ctx.private) {
+            s->ops->cleanup(&s->ctx);
+        }
         g_free(s->tag);
+        g_free(s->ctx.fs_root);
         v9fs_path_free(&path);
     }
     return rc;
@@ -3530,8 +3533,11 @@ out:
 
 void v9fs_device_unrealize_common(V9fsState *s, Error **errp)
 {
-    g_free(s->ctx.fs_root);
+    if (s->ops->cleanup) {
+        s->ops->cleanup(&s->ctx);
+    }
     g_free(s->tag);
+    g_free(s->ctx.fs_root);
 }
 
 typedef struct VirtfsCoResetData {