libvirtd crash when defining scsi storage pool
libvirtd crashes when there is an existing SCSI pool defined
with adapter type as 'scsi_host' and defining a new SCSI pool with adapter
type as 'fc_host' and parent attribute missing or vice versa.
For eg If there is an existing SCSI pool with adapter type as 'scsi_host'
defined using the following XML
<pool type='scsi'>
<name>TEST_SCSI_POOL</name>
<source>
<adapter type='scsi_host' name='scsi_host1'/>
</source>
<target>
<path>/dev/disk/by-path</path>
</target>
</pool>
When defining another SCSI pool with adapter type as 'fc_host' using the
following XML will crash libvirtd
<pool type='scsi'>
<name>TEST_SCSI_FC_POOL</name>
<source>
<adapter type='fc_host' wwnn='1234567890abcdef'
wwpn='abcdef1234567890'/>
</source>
<target>
<path>/dev/disk/by-path</path>
</target>
</pool>
Same is true for the reverse case as well where there exists a SCSI pool with
adapter type as 'fc_host' and another SCSI pool is defined with adapter type as
'scsi_host'
This happens because for fc_host 'name' is optional attribute whereas for
scsi_host its mandatory. However the check in libvirt for finding duplicate
storage pools doesn't take that into account while comparing, resulting into
libvirt crashing
This patch fixes the issue. This patch is based on the suggestion from John
Ferlan
Signed-off-by: Pradipta Kr. Banerjee <bpradip(a)in.ibm.com>
---
V2: Incorporate suggestions from John Ferlan
src/conf/storage_conf.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index e72a869..d42cde7 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -2117,6 +2117,8 @@ virStoragePoolSourceFindDuplicate(virStoragePoolObjListPtr pools,
break;
case VIR_STORAGE_POOL_SCSI:
if (pool->def->source.adapter.type ==
+ VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST &&
+ def->source.adapter.type ==
VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
if (STREQ(pool->def->source.adapter.data.fchost.wwnn,
def->source.adapter.data.fchost.wwnn) &&
@@ -2124,6 +2126,8 @@ virStoragePoolSourceFindDuplicate(virStoragePoolObjListPtr pools,
def->source.adapter.data.fchost.wwpn))
matchpool = pool;
} else if (pool->def->source.adapter.type ==
+ VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST &&
+ def->source.adapter.type ==
VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
if (pool->def->source.adapter.data.scsi_host.name) {
if (STREQ(pool->def->source.adapter.data.scsi_host.name,
--
1.9.3