qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 4/4][RFC] Add logic to QEMU to read command line


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH 4/4][RFC] Add logic to QEMU to read command line options from qcow2 images
Date: Thu, 09 Aug 2007 09:54:17 -0500
User-agent: Thunderbird 2.0.0.6 (X11/20070728)

Daniel P. Berrange wrote:
On Wed, Aug 08, 2007 at 04:52:58PM -0300, Jorge Luc?ngeli Obes wrote:
This patch makes QEMU check for command line options stored in qcow2 images.

I think it is a bad idea from a security POV to automatically extract & use command line args from a disk image like this without the admin explicitly requesting this capability.
eg If I grabbed a demo disk image from a vendors' or community website I would
certainly not trust whatever args may happen to be embedded in the disk image
and thus do not want QEMU to be automatically running using them.

I'd recommend having some command line flag to turn this capability on. For
example a '--args PATH-TO-DISK' flag,

  qemu --args $HOME/fedora.qcow

That's pretty nasty. How do you specify which disk this is then? I do agree with you that allowing arbitrary command line arguments in an image file is probably a bad idea. I think the general idea of being able to launch a single image is useful but I suspect this is not the right way to do it.

What are some people thinking would want to be stored in the file? Most of the command line options are more host specific than guest specific I think. Maybe we can store a pseudo-config instead that only contains a subset of parameters (and therefore, wouldn't pose a security risk)?

Regards,

Anthony Liguori

Would extract args from the disk image & us them.

While traditional

  qemu $HOME/fedora.qcow

would *not* extract args.

diff --git a/qemu/vl.c b/qemu/vl.c
index 4ad39f1..1d28794 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -7000,6 +7012,58 @@ int main(int argc, char **argv)
     nb_nics = 0;
     /* default mac address of the first network interface */

+    bdrv_init();
+
+    drv = bdrv_find_format("qcow2");
+
+    if (argc > 1 && argv[1][0] != '-') {
+        bs = bdrv_new("");
+        if (!bs) {
+            fprintf(stderr, "Not enough memory");
+            exit(1);
+        }
+        if (bdrv_open2(bs, argv[1], 0, drv) < 0) {
+            fprintf(stderr, "Could not open '%s'", argv[1]);
+            bdrv_delete(bs);
+            exit(1);
+        }
+
+        tmpannot = bdrv_get_annot(bs, "commandline_args");
+        if (tmpannot) {
+            pstrcpy(annot, 1024, tmpannot);
+
+            do {
+                tok = strtok(nbtoks == 0? tmpannot : NULL, " ");
+
+                if (tok != NULL)
+                    nbtoks++;
+                else
+                    done = 1;
+            } while (!done);
+
+            free(tmpannot);
+
+            if (nbtoks > 0) {
+                char **argvprime = malloc((nbtoks + argc) * sizeof(char*));
+
+                for (i = 0; i < argc; i++)
+                    argvprime[i] = argv[i];
+
+                for (i = 0; i < nbtoks; i++)
+                    argvprime[i + argc] = strtok(i == 0? annot : NULL, " ");
+
+                argv = argvprime;
+                argc = argc + nbtoks;
+
+                for (i = 0; i < nbtoks + 2; i++)
+                    printf("argv[%d] = %s\n", i, argv[i]);
+
+            }
+        }
+
+        bdrv_delete(bs);
+    }
+
     optind = 1;
     for(;;) {
         if (optind >= argc)


Dan.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]