Pablo Greco e6a3ae
From dc98e8dd5c4aad2f3c480a9513ffba89540dcf3f Mon Sep 17 00:00:00 2001
Pablo Greco e6a3ae
From: Laszlo Ersek <lersek@redhat.com>
Pablo Greco e6a3ae
Date: Thu, 12 Sep 2019 13:05:01 +0100
Pablo Greco e6a3ae
Subject: [PATCH 04/22] i386: fix regression parsing multiboot initrd modules
Pablo Greco e6a3ae
MIME-Version: 1.0
Pablo Greco e6a3ae
Content-Type: text/plain; charset=UTF-8
Pablo Greco e6a3ae
Content-Transfer-Encoding: 8bit
Pablo Greco e6a3ae
Pablo Greco e6a3ae
RH-Author: Laszlo Ersek <lersek@redhat.com>
Pablo Greco e6a3ae
Message-id: <20190912130503.14094-5-lersek@redhat.com>
Pablo Greco e6a3ae
Patchwork-id: 90434
Pablo Greco e6a3ae
O-Subject: [RHEL-8.2.0 qemu-kvm PATCH 4/6] i386: fix regression parsing multiboot initrd modules
Pablo Greco e6a3ae
Bugzilla: 1749022
Pablo Greco e6a3ae
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
From: Daniel P. Berrangé <berrange@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
The logic for parsing the multiboot initrd modules was messed up in
Pablo Greco e6a3ae
Pablo Greco e6a3ae
  commit 950c4e6c94b15cd0d8b63891dddd7a8dbf458e6a
Pablo Greco e6a3ae
  Author: Daniel P. Berrangé <berrange@redhat.com>
Pablo Greco e6a3ae
  Date:   Mon Apr 16 12:17:43 2018 +0100
Pablo Greco e6a3ae
Pablo Greco e6a3ae
    opts: don't silently truncate long option values
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Causing the length to be undercounter, and the number of modules over
Pablo Greco e6a3ae
counted. It also passes NULL to get_opt_value() which was not robust
Pablo Greco e6a3ae
at accepting a NULL value.
Pablo Greco e6a3ae
Pablo Greco e6a3ae
RHEL8 notes:
Pablo Greco e6a3ae
Pablo Greco e6a3ae
- Context difference in "util/qemu-option.c", function get_opt_value();
Pablo Greco e6a3ae
  upstream has commit 5c99fa375da1 ("cutils: Provide strchrnul",
Pablo Greco e6a3ae
  2018-06-29), part of v3.0.0, but downstream lacks it. Harmless, because
Pablo Greco e6a3ae
  said upstream commit only refactors get_opt_value().
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Pablo Greco e6a3ae
Message-Id: <20180514171913.17664-2-berrange@redhat.com>
Pablo Greco e6a3ae
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Pablo Greco e6a3ae
Tested-by: Roman Kagan <rkagan@virtuozzo.com>
Pablo Greco e6a3ae
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Pablo Greco e6a3ae
(cherry picked from commit 6e3ad3f0e31b8e31c6c0769d0f474bcd9673e0e5)
Pablo Greco e6a3ae
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Pablo Greco e6a3ae
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
Pablo Greco e6a3ae
---
Pablo Greco e6a3ae
 hw/i386/multiboot.c | 3 +--
Pablo Greco e6a3ae
 util/qemu-option.c  | 4 +++-
Pablo Greco e6a3ae
 2 files changed, 4 insertions(+), 3 deletions(-)
Pablo Greco e6a3ae
Pablo Greco e6a3ae
diff --git a/hw/i386/multiboot.c b/hw/i386/multiboot.c
Pablo Greco e6a3ae
index 7a2953e..8e26545 100644
Pablo Greco e6a3ae
--- a/hw/i386/multiboot.c
Pablo Greco e6a3ae
+++ b/hw/i386/multiboot.c
Pablo Greco e6a3ae
@@ -292,8 +292,7 @@ int load_multiboot(FWCfgState *fw_cfg,
Pablo Greco e6a3ae
     cmdline_len += strlen(kernel_cmdline) + 1;
Pablo Greco e6a3ae
     if (initrd_filename) {
Pablo Greco e6a3ae
         const char *r = get_opt_value(initrd_filename, NULL);
Pablo Greco e6a3ae
-        cmdline_len += strlen(r) + 1;
Pablo Greco e6a3ae
-        mbs.mb_mods_avail = 1;
Pablo Greco e6a3ae
+        cmdline_len += strlen(initrd_filename) + 1;
Pablo Greco e6a3ae
         while (1) {
Pablo Greco e6a3ae
             mbs.mb_mods_avail++;
Pablo Greco e6a3ae
             r = get_opt_value(r, NULL);
Pablo Greco e6a3ae
diff --git a/util/qemu-option.c b/util/qemu-option.c
Pablo Greco e6a3ae
index ba44a08..a396d60 100644
Pablo Greco e6a3ae
--- a/util/qemu-option.c
Pablo Greco e6a3ae
+++ b/util/qemu-option.c
Pablo Greco e6a3ae
@@ -75,7 +75,9 @@ const char *get_opt_value(const char *p, char **value)
Pablo Greco e6a3ae
     size_t capacity = 0, length;
Pablo Greco e6a3ae
     const char *offset;
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-    *value = NULL;
Pablo Greco e6a3ae
+    if (value) {
Pablo Greco e6a3ae
+        *value = NULL;
Pablo Greco e6a3ae
+    }
Pablo Greco e6a3ae
     while (1) {
Pablo Greco e6a3ae
         offset = strchr(p, ',');
Pablo Greco e6a3ae
         if (!offset) {
Pablo Greco e6a3ae
-- 
Pablo Greco e6a3ae
1.8.3.1
Pablo Greco e6a3ae