]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuBuildMemoryBackendStr: Don't crash if no hugetlbfs is mounted
authorMichal Privoznik <mprivozn@redhat.com>
Sat, 17 Sep 2016 07:29:11 +0000 (09:29 +0200)
committerCole Robinson <crobinso@redhat.com>
Wed, 10 May 2017 19:42:45 +0000 (15:42 -0400)
When trying to migrate a huge page enabled guest, I've noticed
the following crash. Apparently, if no specific hugepages are
requested:

  <memoryBacking>
    <hugepages/>
  </memoryBacking>

and there are no hugepages configured on the destination, we try
to dereference a NULL pointer.

Program received signal SIGSEGV, Segmentation fault.
0x00007fcc907fb20e in qemuGetHugepagePath (hugepage=0x0) at qemu/qemu_conf.c:1447
1447        if (virAsprintf(&ret, "%s/libvirt/qemu", hugepage->mnt_dir) < 0)
(gdb) bt
#0  0x00007fcc907fb20e in qemuGetHugepagePath (hugepage=0x0) at qemu/qemu_conf.c:1447
#1  0x00007fcc907fb2f5 in qemuGetDefaultHugepath (hugetlbfs=0x0, nhugetlbfs=0) at qemu/qemu_conf.c:1466
#2  0x00007fcc907b4afa in qemuBuildMemoryBackendStr (size=4194304, pagesize=0, guestNode=0, userNodeset=0x0, autoNodeset=0x0, def=0x7fcc70019070, qemuCaps=0x7fcc70004000, cfg=0x7fcc5c011800, backendType=0x7fcc95087228, backendProps=0x7fcc95087218,
    force=false) at qemu/qemu_command.c:3297
#3  0x00007fcc907b4f91 in qemuBuildMemoryCellBackendStr (def=0x7fcc70019070, qemuCaps=0x7fcc70004000, cfg=0x7fcc5c011800, cell=0, auto_nodeset=0x0, backendStr=0x7fcc70020360) at qemu/qemu_command.c:3413
#4  0x00007fcc907c0406 in qemuBuildNumaArgStr (cfg=0x7fcc5c011800, def=0x7fcc70019070, cmd=0x7fcc700040c0, qemuCaps=0x7fcc70004000, auto_nodeset=0x0) at qemu/qemu_command.c:7470
#5  0x00007fcc907c5fdf in qemuBuildCommandLine (driver=0x7fcc5c07b8a0, logManager=0x7fcc70003c00, def=0x7fcc70019070, monitor_chr=0x7fcc70004bb0, monitor_json=true, qemuCaps=0x7fcc70004000, migrateURI=0x7fcc700199c0 "defer", snapshot=0x0,
    vmop=VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_START, standalone=false, enableFips=false, nodeset=0x0, nnicindexes=0x7fcc95087498, nicindexes=0x7fcc950874a0, domainLibDir=0x7fcc700047c0 "/var/lib/libvirt/qemu/domain-1-fedora") at qemu/qemu_command.c:9547

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
(cherry picked from commit 647db05e9abac1dfc884298f7ce58fb1c57f231e)

src/qemu/qemu_command.c
src/qemu/qemu_conf.c

index 8fd103a8c7f9449d64a57116428810fcf9e0d54c..911f67b1b1cdb1bfba461cabb5e19c66cecdcdd8 100644 (file)
@@ -3198,6 +3198,12 @@ qemuBuildMemoryBackendStr(unsigned long long size,
             if (!(mem_path = qemuGetHugepagePath(&cfg->hugetlbfs[i])))
                 goto cleanup;
         } else {
+            if (!cfg->nhugetlbfs) {
+                virReportError(VIR_ERR_INTERNAL_ERROR,
+                               "%s", _("hugetlbfs filesystem is not mounted "
+                                       "or disabled by administrator config"));
+                goto cleanup;
+            }
             if (!(mem_path = qemuGetDefaultHugepath(cfg->hugetlbfs,
                                                     cfg->nhugetlbfs)))
                 goto cleanup;
index 7b971f14ff9df9c2e4c1ef0010839c10c60eed4e..88aabcf789c8d004f3c84c8383a9155036a1bc0e 100644 (file)
@@ -1382,6 +1382,16 @@ qemuGetHugepagePath(virHugeTLBFSPtr hugepage)
     return ret;
 }
 
+
+/**
+ * qemuGetDefaultHugepath:
+ * @hugetlbfs: array of configured hugepages
+ * @nhugetlbfs: number of item in the array
+ *
+ * Callers must ensure that @hugetlbfs contains at least one entry.
+ *
+ * Returns 0 on success, -1 otherwise.
+ * */
 char *
 qemuGetDefaultHugepath(virHugeTLBFSPtr hugetlbfs,
                        size_t nhugetlbfs)