From 853d02d85879f9476b6e71ffde5965115cb066af Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Mon, 4 Aug 2008 15:36:01 -0700 Subject: [PATCH] oleaut32: Fix some corner cases in VarBstrCmp. --- dlls/oleaut32/tests/vartype.c | 20 ++++++++++++++++++++ dlls/oleaut32/vartype.c | 19 ++++++++++++++++++- 2 files changed, 38 insertions(+), 1 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..713ebae 100644 --- a/dlls/oleaut32/vartype.c +++ b/dlls/oleaut32/vartype.c @@ -6942,7 +6942,24 @@ HRESULT WINAPI VarBstrCmp(BSTR pbstrLeft, BSTR pbstrRight, LCID lcid, DWORD dwFl if (!pbstrLeft || !*pbstrLeft) { if (!pbstrRight || !*pbstrRight) - return VARCMP_EQ; + { + UINT ll; + UINT lr; + + if (lcid) + { + ll = SysStringLen(pbstrLeft); + lr = SysStringLen(pbstrRight); + } + else + { + ll = SysStringByteLen(pbstrLeft); + lr = SysStringByteLen(pbstrRight); + } + if (ll == lr) + return VARCMP_EQ; + return ll < lr ? VARCMP_LT : VARCMP_GT; + } return VARCMP_LT; } else if (!pbstrRight || !*pbstrRight) -- 1.5.4.5