[libvirt] [PATCH v2 3/3] storage_conf: Resolve libvirtd crash matching scsi_host
Ján Tomko
jtomko at redhat.com
Wed Oct 29 11:31:54 UTC 2014
On 10/06/2014 11:49 PM, John Ferlan wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=1146837
>
> Resolve a crash in libvirtd resulting from commit id 'a4bd62ad' (1.0.6)
> which added parentaddr and unique_id to allow unique identification of
> a scsi_host, but assumed that all the pool entries and the incoming
> definition would be similarly defined. If the existing pool uses the
> 'name' attribute and an incoming pool is using the parentaddr/unique_id,
> then the code will attempt to compare the existing name string against
> the incoming name string which doesn't exist (is NULL) and results in
> a core (STREQ).
>
> Conversely, if the existing pool used the parentaddr/unique_id and the
> to be defined pool used the name, then the comparison would be against
> the parentaddr, but since the incoming pool doesn't have one - that would
> leave the comparison against a parentaddr of all 0's and a unique_id of 0,
> which will always comparison to fail. This means someone could define the
> same source adapter for two pools
>
> In order to resolve this, adjust the code to get the 'host#' to be used
> by the storage scsi backend in order to check/start the pool and make sure
> the incoming definition doesn't match any of the existing pool defs.
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
> src/conf/storage_conf.c | 69 ++++++++++++++++++++++++++++++-------------------
> 1 file changed, 42 insertions(+), 27 deletions(-)
>
> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
> index 36696a4..19c452b 100644
> --- a/src/conf/storage_conf.c
> +++ b/src/conf/storage_conf.c
> @@ -2062,26 +2062,37 @@ virStoragePoolObjIsDuplicate(virStoragePoolObjListPtr pools,
> return ret;
> }
>
> -static bool
> -matchSCSIAdapterParent(virStoragePoolObjPtr pool,
> - virStoragePoolDefPtr def)
> +static int
> +getSCSIHostNumber(virStoragePoolSourceAdapter adapter,
> + unsigned int *hostnum)
> {
> - virDevicePCIAddressPtr pooladdr =
> - &pool->def->source.adapter.data.scsi_host.parentaddr;
> - virDevicePCIAddressPtr defaddr =
> - &def->source.adapter.data.scsi_host.parentaddr;
> - int pool_unique_id =
> - pool->def->source.adapter.data.scsi_host.unique_id;
> - int def_unique_id =
> - def->source.adapter.data.scsi_host.unique_id;
> - if (pooladdr->domain == defaddr->domain &&
> - pooladdr->bus == defaddr->bus &&
> - pooladdr->slot == defaddr->slot &&
> - pooladdr->function == defaddr->function &&
> - pool_unique_id == def_unique_id) {
> - return true;
> - }
> - return false;
> + int ret = -1;
> + unsigned int num;
> + char *name = NULL;
> +
> + if (adapter.data.scsi_host.has_parent) {
> + virDevicePCIAddress addr = adapter.data.scsi_host.parentaddr;
> + unsigned int unique_id = adapter.data.scsi_host.unique_id;
> +
> + if (!(name = virGetSCSIHostNameByParentaddr(addr.domain,
> + addr.bus,
> + addr.slot,
> + addr.function,
> + unique_id)))
> + goto cleanup;
This still has the same problem v1 does:
https://www.redhat.com/archives/libvir-list/2014-October/msg00117.html
A valid pool definition for an existing device can be refused because another
definition, the one we already accepted, is invalid. I think this is strange
behavior and I would rather allow duplicit pools if the user went through the
trouble of bypassing our checks.
Jan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20141029/7f64adcc/attachment-0001.sig>
More information about the libvir-list
mailing list