From 7a34b8ee54aa58fdb621c6847ab0f9e93149da73 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Tue, 5 Aug 2008 17:15:51 -0700 Subject: [PATCH] oleaut32: Fix some corner cases in VarBstrCmp. --- dlls/oleaut32/tests/vartype.c | 20 ++++++++++++++++++++ dlls/oleaut32/vartype.c | 24 +++++++++++++++--------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/dlls/oleaut32/tests/vartype.c b/dlls/oleaut32/tests/vartype.c index e2db519..1a1dba2 100644 --- a/dlls/oleaut32/tests/vartype.c +++ b/dlls/oleaut32/tests/vartype.c @@ -4983,6 +4983,8 @@ static void test_VarBstrCmp(void) static const WCHAR s2[] = { 'a',0,'b' }; static const char sb1[] = {1,0,1}; static const char sb2[] = {1,0,2}; + static const char sbchr0[] = {0,0}; + static const char sbchr00[] = {0,0,0}; BSTR bstr, bstrempty, bstr2; CHECKPTR(VarBstrCmp); @@ -5021,6 +5023,15 @@ static void test_VarBstrCmp(void) SysFreeString(bstr); + bstr = SysAllocStringByteLen(sbchr0, sizeof(sbchr0)); + bstr2 = SysAllocStringByteLen(sbchr0, sizeof(sbchr00)); + VARBSTRCMP(bstr,bstrempty,0,VARCMP_GT); + VARBSTRCMP(bstrempty,bstr,0,VARCMP_LT); + VARBSTRCMP(bstr2,bstrempty,0,VARCMP_GT); + VARBSTRCMP(bstr2,bstr,0,VARCMP_EQ); + SysFreeString(bstr2); + SysFreeString(bstr); + /* When (LCID == 0) it should be a binary comparison * so these two strings could not match. */ @@ -5030,6 +5041,15 @@ static void test_VarBstrCmp(void) VARBSTRCMP(bstr,bstr2,0,VARCMP_LT); SysFreeString(bstr2); SysFreeString(bstr); + + bstr = SysAllocStringByteLen(sbchr0, sizeof(sbchr0)); + bstr2 = SysAllocStringByteLen(sbchr0, sizeof(sbchr00)); + VARBSTRCMP(bstr,bstrempty,0,VARCMP_GT); + VARBSTRCMP(bstrempty,bstr,0,VARCMP_LT); + VARBSTRCMP(bstr2,bstrempty,0,VARCMP_GT); + VARBSTRCMP(bstr2,bstr,0,VARCMP_GT); + SysFreeString(bstr2); + SysFreeString(bstr); } /* Get the internal representation of a BSTR */ diff --git a/dlls/oleaut32/vartype.c b/dlls/oleaut32/vartype.c index daeac85..b59c97e 100644 --- a/dlls/oleaut32/vartype.c +++ b/dlls/oleaut32/vartype.c @@ -6939,15 +6939,6 @@ HRESULT WINAPI VarBstrCmp(BSTR pbstrLeft, BSTR pbstrRight, LCID lcid, DWORD dwFl debugstr_wn(pbstrLeft, SysStringLen(pbstrLeft)), debugstr_wn(pbstrRight, SysStringLen(pbstrRight)), lcid, dwFlags); - if (!pbstrLeft || !*pbstrLeft) - { - if (!pbstrRight || !*pbstrRight) - return VARCMP_EQ; - return VARCMP_LT; - } - else if (!pbstrRight || !*pbstrRight) - return VARCMP_GT; - if (lcid == 0) { unsigned int lenLeft = SysStringByteLen(pbstrLeft); @@ -6965,6 +6956,21 @@ HRESULT WINAPI VarBstrCmp(BSTR pbstrLeft, BSTR pbstrRight, LCID lcid, DWORD dwFl } else { + if (!pbstrLeft || !*pbstrLeft) + { + if (!pbstrRight || !*pbstrRight) + { + UINT ll = SysStringLen(pbstrLeft); + UINT lr = SysStringLen(pbstrRight); + if (ll == lr) + return VARCMP_EQ; + return ll < lr ? VARCMP_LT : VARCMP_GT; + } + return VARCMP_LT; + } + else if (!pbstrRight || !*pbstrRight) + return VARCMP_GT; + hres = CompareStringW(lcid, dwFlags, pbstrLeft, SysStringLen(pbstrLeft), pbstrRight, SysStringLen(pbstrRight)) - 1; TRACE("%d\n", hres); -- 1.5.4.5