Module: wine Branch: master Commit: 19957240e18de7c21b2a13483e04384edc17b6fe URL: https://gitlab.winehq.org/wine/wine/-/commit/19957240e18de7c21b2a13483e04384...
Author: Zhiyi Zhang zzhang@codeweavers.com Date: Fri Nov 17 16:18:07 2023 +0800
oledb32: Quote values containing semicolons.
---
dlls/oledb32/datainit.c | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-)
diff --git a/dlls/oledb32/datainit.c b/dlls/oledb32/datainit.c index 95ff7013e92..801317f82a5 100644 --- a/dlls/oledb32/datainit.c +++ b/dlls/oledb32/datainit.c @@ -780,18 +780,30 @@ static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *o /* returns character length of string representation */ static int get_propvalue_length(DBPROP *prop) { + VARIANT *v = &prop->vValue; VARIANT str; HRESULT hr; + int length;
- if (V_VT(&prop->vValue) == VT_BSTR) return SysStringLen(V_BSTR(&prop->vValue)); + if (V_VT(v) == VT_BSTR) + { + length = SysStringLen(V_BSTR(v)); + /* Quotes values with '"' if the value contains semicolons */ + if (wcsstr(V_BSTR(v), L";")) + length += 2; + return length; + }
VariantInit(&str); - hr = VariantChangeType(&str, &prop->vValue, 0, VT_BSTR); + hr = VariantChangeType(&str, v, 0, VT_BSTR); if (hr == S_OK) { - int len = SysStringLen(V_BSTR(&str)); + length = SysStringLen(V_BSTR(&str)); + /* Quotes values with '"' if the value contains semicolons */ + if (wcsstr(V_BSTR(&str), L";")) + length += 2; VariantClear(&str); - return len; + return length; }
return 0; @@ -805,7 +817,16 @@ static void write_propvalue_str(WCHAR *str, DBPROP *prop)
if (V_VT(v) == VT_BSTR) { - lstrcatW(str, V_BSTR(v)); + if (wcsstr(V_BSTR(v), L";")) + { + lstrcatW(str, L"""); + lstrcatW(str, V_BSTR(v)); + lstrcatW(str, L"""); + } + else + { + lstrcatW(str, V_BSTR(v)); + } return; }
@@ -813,7 +834,16 @@ static void write_propvalue_str(WCHAR *str, DBPROP *prop) hr = VariantChangeType(&vstr, v, VARIANT_ALPHABOOL, VT_BSTR); if (hr == S_OK) { - lstrcatW(str, V_BSTR(&vstr)); + if (wcsstr(V_BSTR(&vstr), L";")) + { + lstrcatW(str, L"""); + lstrcatW(str, V_BSTR(&vstr)); + lstrcatW(str, L"""); + } + else + { + lstrcatW(str, V_BSTR(&vstr)); + } VariantClear(&vstr); } }