
On Wed, Jan 20, 2010 at 02:46:10AM +0100, Matthias Bolte wrote:
@@ -792,16 +797,30 @@ qemudCapsInitGuest(virCapsPtr caps, */ if (STREQ(info->arch, hostmachine) || (STREQ(hostmachine, "x86_64") && STREQ(info->arch, "i686"))) { - const char *const kvmbins[] = { "/usr/bin/qemu-kvm", /* Fedora */ - "/usr/bin/kvm" }; /* Upstream .spec */ + if (access("/dev/kvm", F_OK) == 0) { + const char *const kvmbins[] = { "qemu-kvm", /* Fedora */ + "kvm" }; /* Upstream .spec */ + + for (i = 0; i < ARRAY_CARDINALITY(kvmbins); ++i) { + kvmbin = virFindFileInPath(kvmbins[i]); + + if (kvmbin == NULL || access(kvmbin, X_OK) != 0) { + VIR_FREE(kvmbin); + continue; + }
- for (i = 0; i < ARRAY_CARDINALITY(kvmbins); ++i) { - if (access(kvmbins[i], X_OK) == 0 && - access("/dev/kvm", F_OK) == 0) { haskvm = 1; - kvmbin = kvmbins[i]; - if (!binary) - binary = kvmbin; + + if (binary == NULL) { + binary = strdup(kvmbin);
Why does this need to strdup(kvmbin), when virFindFileInPath() is already returning a newly allocated string ? Seems like we could just avoid that
+ + if (binary == NULL) { + virReportOOMError(NULL); + VIR_FREE(kvmbin); + return -1; + } + } + break; }
I think this loop is also leaking 'kvmbin', since it just overrwrites 'kvmbin' on each iteration, the final cleanup code will only free the last one that was allocated
- return -1; + goto error; } }
+ VIR_FREE(binary); + VIR_FREE(kvmbin); + return 0; + +no_memory: + virReportOOMError(NULL); + +error: + VIR_FREE(binary); + VIR_FREE(kvmbin); + virCapabilitiesFreeMachines(machines, nmachines); + + return -1; }
Generally the patch looks OK though Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|