qemu-block
[Top][All Lists]
Advanced

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

Re: [Qemu-block] [PATCH 05/10] hw/i386/pc.c: Don't use load_image()


From: Eric Blake
Subject: Re: [Qemu-block] [PATCH 05/10] hw/i386/pc.c: Don't use load_image()
Date: Fri, 30 Nov 2018 14:26:40 -0600
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.0

On 11/30/18 9:17 AM, Peter Maydell wrote:
The load_image() function is deprecated, as it does not let the
caller specify how large the buffer to read the file into is.
Use the glib g_file_get_contents() function instead, which does
the whole "allocate memory for the file and read it in" operation.

Signed-off-by: Peter Maydell <address@hidden>
---
  hw/i386/pc.c | 22 ++++++++++++----------
  1 file changed, 12 insertions(+), 10 deletions(-)


+++ b/hw/i386/pc.c
@@ -839,10 +839,9 @@ static void load_linux(PCMachineState *pcms,
  {
      uint16_t protocol;
      int setup_size, kernel_size, cmdline_size;
-    int64_t initrd_size = 0;
      int dtb_size, setup_data_offset;
      uint32_t initrd_max;
-    uint8_t header[8192], *setup, *kernel, *initrd_data;
+    uint8_t header[8192], *setup, *kernel;

Unrelated - but 'header' at 8k is larger than I like for an auto variable. Some OSs put guard pages at only 4k granularity, so this much stack allocation can miss stack overflow.


-        initrd_size = get_image_size(initrd_filename);
-        if (initrd_size < 0) {
+        if (!g_file_get_contents(initrd_filename, &initrd_data,
+                                 &initrd_size, &gerr)) {
              fprintf(stderr, "qemu: error reading initrd %s: %s\n",
-                    initrd_filename, strerror(errno));
+                    initrd_filename, gerr->message);
              exit(1);
-        } else if (initrd_size >= initrd_max) {
+        }
+        if (initrd_size >= initrd_max) {
              fprintf(stderr, "qemu: initrd is too large, cannot support."
-                    "(max: %"PRIu32", need %"PRId64")\n", initrd_max, 
initrd_size);
+                    "(max: %"PRIu32", need %"PRId64")\n",
+                    initrd_max, initrd_size);
              exit(1);

You're exiting anyway, so it doesn't matter, but free'ing initrd_data might satisfy a lint-checker.

Reviewed-by: Eric Blake <address@hidden>

--
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org



reply via email to

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