
On 10/17/2009 08:58 AM, Matthias Bolte wrote:
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index f09f814..77f7be3 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -1215,6 +1215,95 @@ virNodeDeviceDefParseFile(virConnectPtr conn, Â Â return virNodeDeviceDefParse(conn, NULL, filename, create); Â }
+/* + * Return fc_host dev's WWNN and WWPN + */ +int +virNodeDeviceGetWWNs(virConnectPtr conn, + Â Â Â Â Â Â Â Â Â Â virNodeDeviceDefPtr def, + Â Â Â Â Â Â Â Â Â Â char **wwnn, + Â Â Â Â Â Â Â Â Â Â char **wwpn) +{ + Â Â virNodeDevCapsDefPtr cap = NULL; + Â Â int ret = 0; + + Â Â cap = def->caps; + Â Â while (cap != NULL) { + Â Â Â Â if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST && + Â Â Â Â Â Â cap->data.scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) { + Â Â Â Â Â Â *wwnn = strdup(cap->data.scsi_host.wwnn); + Â Â Â Â Â Â *wwpn = strdup(cap->data.scsi_host.wwpn); + Â Â Â Â Â Â break; + Â Â Â Â } + + Â Â Â Â cap = cap->next; + Â Â } + + Â Â if (cap == NULL) { + Â Â Â Â virNodeDeviceReportError(conn, VIR_ERR_NO_SUPPORT, + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â "%s", _("Device is not a fibre channel HBA")); + Â Â Â Â ret = -1; + Â Â } + + Â Â if (*wwnn == NULL || *wwpn == NULL) {
I know you have just moved this function to another file, but here seems to be a logical error that may result in a false-positive OOM error.
If the while loop is left without finding the wanted device (cap == NULL), then *wwnn and *wwpn have not been set inside this function and point to their initial value (probably NULL). Because they have not been set inside this function (in the cap == NULL case), they should not be tested for NULL to detect an OOM condition.
To fix this
if (*wwnn == NULL || *wwpn == NULL) {
could be changed to
else if (*wwnn == NULL || *wwpn == NULL) {
so the OOM check is only done if the wanted device has been found (cap != NULL).
+ Â Â Â Â /* Free the other one, if allocated... */ + Â Â Â Â VIR_FREE(wwnn); + Â Â Â Â VIR_FREE(wwpn); + Â Â Â Â ret = -1; + Â Â Â Â virReportOOMError(conn); + Â Â } + + Â Â return ret; +} +
The OOM detection should be fixed by an additional patch, so ACK to this one.
Good catch. I agree a follow up patch is the way to go. Thanks, Cole