Module: wine Branch: master Commit: 19957240e18de7c21b2a13483e04384edc17b6fe URL: https://gitlab.winehq.org/wine/wine/-/commit/19957240e18de7c21b2a13483e04384... Author: Zhiyi Zhang <zzhang(a)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); } }