From c390bcfec5b438227448258eb953881a0edb8d9f Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Mon, 15 Mar 2010 21:42:01 +0100 Subject: [PATCH] virDomainDiskDefAssignAddress: return int, not void Before, this function would blindly accept an invalid def->dst and then abuse the idx=-1 it would get from virDiskNameToIndex, when passing it invalid strings like "xvda:disk" and "sda1". Now, this function returns -1 upon failure. * src/conf/domain_conf.c (virDomainDiskDefAssignAddress): as above. Update callers. * src/conf/domain_conf.h: Update prototype. * src/qemu/qemu_conf.c: Update callers. --- src/conf/domain_conf.c | 11 ++++++++--- src/conf/domain_conf.h | 4 ++-- src/qemu/qemu_conf.c | 11 +++++++++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 56c5239dc..79c7ea3c6 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1233,10 +1233,12 @@ cleanup: } -void +int virDomainDiskDefAssignAddress(virDomainDiskDefPtr def) { int idx = virDiskNameToIndex(def->dst); + if (idx < 0) + return -1; switch (def->bus) { case VIR_DOMAIN_DISK_BUS_SCSI: @@ -1270,6 +1272,8 @@ virDomainDiskDefAssignAddress(virDomainDiskDefPtr def) /* Other disk bus's aren't controller based */ break; } + + return 0; } /* Parse the XML definition for a disk @@ -1498,8 +1502,9 @@ virDomainDiskDefParseXML(xmlNodePtr node, def->serial = serial; serial = NULL; - if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) - virDomainDiskDefAssignAddress(def); + if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE + && virDomainDiskDefAssignAddress(def) < 0) + goto error; cleanup: VIR_FREE(bus); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0540a775b..44fff0ccc 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1,7 +1,7 @@ /* * domain_conf.h: domain XML processing * - * Copyright (C) 2006-2008 Red Hat, Inc. + * Copyright (C) 2006-2008, 2010 Red Hat, Inc. * Copyright (C) 2006-2008 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -855,7 +855,7 @@ int virDomainDiskInsert(virDomainDefPtr def, virDomainDiskDefPtr disk); void virDomainDiskInsertPreAlloced(virDomainDefPtr def, virDomainDiskDefPtr disk); -void virDomainDiskDefAssignAddress(virDomainDiskDefPtr def); +int virDomainDiskDefAssignAddress(virDomainDiskDefPtr def); int virDomainControllerInsert(virDomainDefPtr def, virDomainControllerDefPtr controller); diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index f2d36f71c..902eecb0d 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -4815,7 +4815,13 @@ qemuParseCommandLineDisk(const char *val, else def->dst[2] = 'a' + idx; - virDomainDiskDefAssignAddress(def); + if (virDomainDiskDefAssignAddress(def) < 0) { + qemuReportError(VIR_ERR_INTERNAL_ERROR, + _("invalid device name '%s'"), def->dst); + virDomainDiskDefFree(def); + def = NULL; + /* fall through to "cleanup" */ + } cleanup: for (i = 0 ; i < nkeywords ; i++) { @@ -5623,7 +5629,8 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps, goto no_memory; } - virDomainDiskDefAssignAddress(disk); + if (virDomainDiskDefAssignAddress(disk) < 0) + goto error; if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0) { virDomainDiskDefFree(disk); -- 2.39.5