john.levon(a)sun.com wrote:
Use virMacAddrCompare() in xs_internal.c
This solves a failure to look up a net device.
Please take the time to describe the failure scenario
in enough detail that someone (maybe me) can reproduce it.
IMHO, a bug-fix patch like this is best accompanied by
a test case that fails before the patch and succeeds with it.
The patch looks ok, but doesn't need the new label.
Nor does it need to free "val" outside the loop.
I've included a suggested incremental patch below.
diff --git a/src/xs_internal.c b/src/xs_internal.c
--- a/src/xs_internal.c
+++ b/src/xs_internal.c
@@ -915,7 +915,7 @@ char *
char *
xenStoreDomainGetNetworkID(virConnectPtr conn, int id, const char *mac) {
char dir[80], path[128], **list = NULL, *val = NULL;
Also, though I know it's not your code, both of the above
initializations are useless and should be removed.
That would be obvious if each of the variables
was declared at first use.
- unsigned int maclen, len, i, num;
+ unsigned int len, i, num;
char *ret = NULL;
xenUnifiedPrivatePtr priv;
@@ -926,9 +926,6 @@ xenStoreDomainGetNetworkID(virConnectPtr
if (priv->xshandle == NULL)
return (NULL);
if (mac == NULL)
- return (NULL);
- maclen = strlen(mac);
- if (maclen <= 0)
return (NULL);
snprintf(dir, sizeof(dir), "/local/domain/0/backend/vif/%d", id);
@@ -937,18 +934,20 @@ xenStoreDomainGetNetworkID(virConnectPtr
return(NULL);
for (i = 0; i < num; i++) {
snprintf(path, sizeof(path), "%s/%s/%s", dir, list[i],
"mac");
- val = xs_read(priv->xshandle, 0, path, &len);
- if (val == NULL)
+ if ((val = xs_read(priv->xshandle, 0, path, &len)) == NULL)
break;
- if ((maclen != len) || memcmp(val, mac, len)) {
- free(val);
- } else {
+
+ if (virMacAddrCompare(val, mac) == 0) {
ret = strdup(list[i]);
- free(val);
- break;
+ goto out;
}
- }
- free(list);
+
+ VIR_FREE(val);
+ }
+
+out:
+ VIR_FREE(val);
+ VIR_FREE(list);
return(ret);
}
diff --git a/src/xs_internal.c b/src/xs_internal.c
index ce707e9..1b4284f 100644
--- a/src/xs_internal.c
+++ b/src/xs_internal.c
@@ -937,16 +937,14 @@ xenStoreDomainGetNetworkID(virConnectPtr conn, int id, const char
*mac) {
if ((val = xs_read(priv->xshandle, 0, path, &len)) == NULL)
break;
- if (virMacAddrCompare(val, mac) == 0) {
+ bool match = (virMacAddrCompare(val, mac) == 0);
+ VIR_FREE(val);
+ if (match) {
ret = strdup(list[i]);
- goto out;
+ break;
}
-
- VIR_FREE(val);
}
-out:
- VIR_FREE(val);
VIR_FREE(list);
return(ret);
}