[libvirt] [PATCH] libxl: fix libvirtd segfault
Jim Fehlig
jfehlig at suse.com
Sat Aug 10 04:55:59 UTC 2013
Dave Allan wrote:
> Functional ack; this patch fixes the crash on my system.
>
I've pushed this patch since it fixes a crash affecting everyone that
has built the libxl driver but not actually running Xen. Any additional
review comments can be addressed with a follow-up patch.
Regards,
Jim
> On Fri, Aug 09, 2013 at 05:58:45PM -0600, Jim Fehlig wrote:
>
>> Commit d72ef888 introduced a bug in the libxl driver that will
>> segfault libvirtd if libxl reports an error message, e.g. when
>> attempting to initialize the driver on a non-Xen system. I
>> assumed it was valid to pass a NULL logger to libxl_ctx_alloc(),
>> but that is not the case since any errors associated with the ctx
>> that are emitted by libxl will dereference the logger and crash
>> libvirtd.
>>
>> Errors associated with the libxl driver-wide ctx could be useful
>> for debugging anyway, so create a 'libxl-driver.log' to capture
>> these errors.
>> ---
>> src/libxl/libxl_conf.h | 3 +++
>> src/libxl/libxl_driver.c | 30 ++++++++++++++++++++++++++++--
>> 2 files changed, 31 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
>> index 78133b9..9d72b72 100644
>> --- a/src/libxl/libxl_conf.h
>> +++ b/src/libxl/libxl_conf.h
>> @@ -57,6 +57,9 @@ struct _libxlDriverPrivate {
>> virDomainXMLOptionPtr xmlopt;
>> unsigned int version;
>>
>> + /* log stream for driver-wide libxl ctx */
>> + FILE *logger_file;
>> + xentoollog_logger *logger;
>> /* libxl ctx for driver wide ops; getVersion, getNodeInfo, ... */
>> libxl_ctx *ctx;
>>
>> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
>> index cc9e772..9dc7261 100644
>> --- a/src/libxl/libxl_driver.c
>> +++ b/src/libxl/libxl_driver.c
>> @@ -1180,6 +1180,9 @@ libxlStateCleanup(void)
>> virObjectUnref(libxl_driver->xmlopt);
>> virObjectUnref(libxl_driver->domains);
>> libxl_ctx_free(libxl_driver->ctx);
>> + xtl_logger_destroy(libxl_driver->logger);
>> + if (libxl_driver->logger_file)
>> + VIR_FORCE_FCLOSE(libxl_driver->logger_file);
>>
>> virObjectUnref(libxl_driver->reservedVNCPorts);
>>
>> @@ -1229,6 +1232,7 @@ libxlStateInitialize(bool privileged,
>> void *opaque ATTRIBUTE_UNUSED)
>> {
>> const libxl_version_info *ver_info;
>> + char *log_file = NULL;
>> virCommandPtr cmd;
>> int status, ret = 0;
>> unsigned int free_mem;
>> @@ -1308,6 +1312,17 @@ libxlStateInitialize(bool privileged,
>> goto error;
>> }
>>
>> + if (virAsprintf(&log_file, "%s/libxl-driver.log", libxl_driver->logDir) < 0)
>> + goto error;
>> +
>> + if ((libxl_driver->logger_file = fopen(log_file, "a")) == NULL) {
>> + virReportSystemError(errno,
>> + _("failed to create logfile %s"),
>> + log_file);
>> + goto error;
>> + }
>> + VIR_FREE(log_file);
>> +
>> /* read the host sysinfo */
>> if (privileged)
>> libxl_driver->hostsysinfo = virSysinfoRead();
>> @@ -1316,8 +1331,18 @@ libxlStateInitialize(bool privileged,
>> if (!libxl_driver->domainEventState)
>> goto error;
>>
>> - if (libxl_ctx_alloc(&libxl_driver->ctx, LIBXL_VERSION, 0, NULL)) {
>> - VIR_INFO("cannot initialize libxenlight context, probably not running in a Xen Dom0, disabling driver");
>> + libxl_driver->logger =
>> + (xentoollog_logger *)xtl_createlogger_stdiostream(libxl_driver->logger_file, XTL_DEBUG, 0);
>> + if (!libxl_driver->logger) {
>> + VIR_INFO("cannot create logger for libxenlight, disabling driver");
>> + goto fail;
>> + }
>> +
>> + if (libxl_ctx_alloc(&libxl_driver->ctx,
>> + LIBXL_VERSION, 0,
>> + libxl_driver->logger)) {
>> + VIR_INFO("cannot initialize libxenlight context, probably not running "
>> + "in a Xen Dom0, disabling driver");
>> goto fail;
>> }
>>
>> @@ -1383,6 +1408,7 @@ libxlStateInitialize(bool privileged,
>> error:
>> ret = -1;
>> fail:
>> + VIR_FREE(log_file);
>> if (libxl_driver)
>> libxlDriverUnlock(libxl_driver);
>> libxlStateCleanup();
>>
More information about the libvir-list
mailing list