@@ -350,6 +350,8 @@ tranform_wide(char *name, wchar_t *wide_name)
return true;
}
+#define count_of(array) (sizeof(array)/sizeof(array[0]))
+
/* This function will delete a switch internal port with a given name as input
* executing "RemoveResourceSettings" as per documentation:
* https://msdn.microsoft.com/en-us/library/hh850277%28v=vs.85%29.aspx
@@ -414,9 +416,9 @@ delete_wmi_port(char *name)
retval = false;
goto error;
}
- wcscat_s(internal_port_query, sizeof(internal_port_query), wide_name);
+ wcscat_s(internal_port_query, count_of(internal_port_query), wide_name);
- wcscat_s(internal_port_query, sizeof(internal_port_query), L"\"");
+ wcscat_s(internal_port_query, count_of(internal_port_query), L"\"");
hres = psvc->lpVtbl->ExecQuery(psvc,
L"WQL",
@@ -626,6 +628,7 @@ error:
return retval;
}
+
/* This function will create an internal port on the switch given a given name
* executing the method AddResourceSettings as per documentation:
* https://msdn.microsoft.com/en-us/library/hh850019%28v=vs.85%29.aspx.
@@ -700,9 +703,10 @@ create_wmi_port(char *name) {
retval = false;
goto error;
}
- wcscat_s(internal_port_query, sizeof(internal_port_query), wide_name);
- wcscat_s(internal_port_query, sizeof(internal_port_query), L"\"");
+ wcscat_s(internal_port_query, count_of(internal_port_query), wide_name);
+
+ wcscat_s(internal_port_query, count_of(internal_port_query), L"\"");
hres = psvc->lpVtbl->ExecQuery(psvc,
L"WQL",
internal_port_query,
@@ -748,7 +752,7 @@ create_wmi_port(char *name) {
retval = false;
goto error;
}
- wcscpy_s(internal_port_query, sizeof(internal_port_query),
+ wcscpy_s(internal_port_query, count_of(internal_port_query),
L"SELECT * FROM Msvm_VirtualEthernetSwitch WHERE Name = \"");
hres = pcls_obj->lpVtbl->Get(pcls_obj, L"SystemName", 0,
@@ -758,7 +762,7 @@ create_wmi_port(char *name) {
goto error;
}
- wcscat_s(internal_port_query, sizeof(internal_port_query),
+ wcscat_s(internal_port_query, count_of(internal_port_query),
vt_prop.bstrVal);
VariantClear(&vt_prop);
@@ -780,7 +784,7 @@ create_wmi_port(char *name) {
}
/* Get the switch object on which the extension is activated. */
- wcscat_s(internal_port_query, sizeof(internal_port_query), L"\"");
+ wcscat_s(internal_port_query, count_of(internal_port_query), L"\"");
hres = psvc->lpVtbl->ExecQuery(psvc,
L"WQL",
internal_port_query,
@@ -810,11 +814,11 @@ create_wmi_port(char *name) {
goto error;
}
- wcscpy_s(internal_port_query, sizeof(internal_port_query),
+ wcscpy_s(internal_port_query, count_of(internal_port_query),
L"SELECT * FROM Msvm_VirtualEthernetSwitchSettingData WHERE "
L"ElementName = \"");
- wcscat_s(internal_port_query, sizeof(internal_port_query),
+ wcscat_s(internal_port_query, count_of(internal_port_query),
vt_prop.bstrVal);
VariantClear(&vt_prop);
@@ -831,11 +835,11 @@ create_wmi_port(char *name) {
* Uniquely identifies an instance of this class. This property is
* inherited from CIM_SettingData and is always
* set to "Microsoft:GUID\DeviceSpecificData". */
- wcscat_s(internal_port_query, sizeof(internal_port_query),
+ wcscat_s(internal_port_query, count_of(internal_port_query),
L"\" AND InstanceID = \"Microsoft:");
- wcscat_s(internal_port_query, sizeof(internal_port_query),
+ wcscat_s(internal_port_query, count_of(internal_port_query),
vt_prop.bstrVal);
- wcscat_s(internal_port_query, sizeof(internal_port_query),
+ wcscat_s(internal_port_query, count_of(internal_port_query),
L"\"");
VariantClear(&vt_prop);
@@ -1135,10 +1139,10 @@ create_wmi_port(char *name) {
goto error;
}
- wcscpy_s(internal_port_query, sizeof(internal_port_query),
+ wcscpy_s(internal_port_query, count_of(internal_port_query),
L"SELECT * FROM MSFT_NetAdapter WHERE Name LIKE '%%");
- wcscat_s(internal_port_query, sizeof(internal_port_query), wide_name);
- wcscat_s(internal_port_query, sizeof(internal_port_query), L"%%'");
+ wcscat_s(internal_port_query, count_of(internal_port_query), wide_name);
+ wcscat_s(internal_port_query, count_of(internal_port_query), L"%%'");
/* Get the object with the port name equal to name on the CIM. */
hres = psvc->lpVtbl->ExecQuery(psvc,
wcscat_s and wcscpy_s requires number of elements as argument. wchar_t uses 2 bytes for storage and using sizeof(internal_port_query) causes access violation error on Windows 2012 R2 (64 bit). This patch introduces a count_of() function to return the count of the wchar_t array. Signed-off-by: Sairam Venugopal <vsairam@vmware.com> Reported-by: Sairam Venugopal <vsairam@vmware.com> Reported-at: openvswitch/ovs-issues#121 --- lib/wmi.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-)