On 06/17/2013 01:56 PM, james robson wrote:
<...snip...>
> diff --git a/src/util/virnetdevopenvswitch.c
b/src/util/virnetdevopenvswitch.c
> index 2aee445..47e6027 100644
> --- a/src/util/virnetdevopenvswitch.c
> +++ b/src/util/virnetdevopenvswitch.c
> @@ -109,8 +109,22 @@ int virNetDevOpenvswitchAddPort(const char *brname, const char
*ifname,
> virCommandAddArgList(cmd, "--timeout=5", "--",
"--may-exist", "add-port",
> brname, ifname, NULL);
>
> - if (virBufferUse(&buf) != 0)
> + if (virBufferUse(&buf) != 0) {
> + switch (virtVlan->nativeMode) {
> + case VIR_NATIVE_VLAN_MODE_TAGGED:
> + virCommandAddArg(cmd, "vlan_mode=native-tagged");
> + virCommandAddArgFormat(cmd, "tag=%d",
virtVlan->nativeTag);
> + break;
> + case VIR_NATIVE_VLAN_MODE_UNTAGGED:
> + virCommandAddArg(cmd, "vlan_mode=native-untagged");
> + virCommandAddArgFormat(cmd, "tag=%d",
virtVlan->nativeTag);
> + break;
> + case VIR_NATIVE_VLAN_MODE_DEFAULT:
> + default:
> + break;
> + }
> virCommandAddArgList(cmd, virBufferCurrentContent(&buf), NULL);
> + }
My overnight Coverity run has found the following problem with above code.
The issue is that at line 84 there's an "if (virtVlan &&" condition;
whereas,
this reference at line 112 doesn't check virtVlan before referencing:
68
(1) Event cond_false: Condition "virAsprintf(&attachedmac_ex_id,
"external-ids:attached-mac=\"%s\"", macaddrstr) < 0", taking
false branch
69 if (virAsprintf(&attachedmac_ex_id,
"external-ids:attached-mac=\"%s\"",
70 macaddrstr) < 0)
71 goto out_of_memory;
(2) Event cond_false: Condition "virAsprintf(&ifaceid_ex_id,
"external-ids:iface-id=\"%s\"", ifuuidstr) < 0", taking false
branch
72 if (virAsprintf(&ifaceid_ex_id,
"external-ids:iface-id=\"%s\"",
73 ifuuidstr) < 0)
74 goto out_of_memory;
(3) Event cond_false: Condition "virAsprintf(&vmid_ex_id,
"external-ids:vm-id=\"%s\"", vmuuidstr) < 0", taking false
branch
75 if (virAsprintf(&vmid_ex_id,
"external-ids:vm-id=\"%s\"",
76 vmuuidstr) < 0)
77 goto out_of_memory;
(4) Event cond_true: Condition "ovsport->profileID[0] != 0", taking true
branch
78 if (ovsport->profileID[0] != '\0') {
(5) Event cond_false: Condition "virAsprintf(&profile_ex_id,
"external-ids:port-profile=\"%s\"", ovsport->profileID) <
0", taking false branch
79 if (virAsprintf(&profile_ex_id,
"external-ids:port-profile=\"%s\"",
80 ovsport->profileID) < 0)
81 goto out_of_memory;
82 }
83
(6) Event cond_false: Condition "virtVlan", taking false branch
(8) Event var_compare_op: Comparing "virtVlan" to null implies that
"virtVlan" might be null.
Also see events: [var_deref_op]
84 if (virtVlan && virtVlan->nTags > 0) {
85
86 /* Trunk port first */
87 if (virtVlan->trunk) {
88 virBufferAddLit(&buf, "trunk=");
89
90 /*
91 * Trunk ports have at least one VLAN. Do the first one
92 * outside the "for" loop so we can put a "," at
the
93 * start of the for loop if there are more than one VLANs
94 * on this trunk port.
95 */
96 virBufferAsprintf(&buf, "%d", virtVlan->tag[i]);
97
98 for (i = 1; i < virtVlan->nTags; i++) {
99 virBufferAddLit(&buf, ",");
100 virBufferAsprintf(&buf, "%d", virtVlan->tag[i]);
101 }
102 } else if (virtVlan->nTags) {
103 virBufferAsprintf(&buf, "tag=%d", virtVlan->tag[0]);
104 }
(7) Event if_end: End of if statement
105 }
106
107 cmd = virCommandNew(OVSVSCTL);
108
109 virCommandAddArgList(cmd, "--timeout=5", "--",
"--may-exist", "add-port",
110 brname, ifname, NULL);
111
(9) Event var_deref_op: Dereferencing null pointer "virtVlan".
Also see events: [var_compare_op]
112 switch (virtVlan->nativeMode) {
113 case VIR_NATIVE_VLAN_MODE_TAGGED:
114 virCommandAddArg(cmd, "vlan_mode=native-tagged");
115 virCommandAddArgFormat(cmd, "tag=%d", virtVlan->nativeTag);
116 break;
117 case VIR_NATIVE_VLAN_MODE_UNTAGGED:
118 virCommandAddArg(cmd, "vlan_mode=native-untagged");
119 virCommandAddArgFormat(cmd, "tag=%d", virtVlan->nativeTag);
120 break;
121 case VIR_NATIVE_VLAN_MODE_DEFAULT:
122 default:
123 break;
124 }
<...snip...>