Lei Zhang : oleaut32: Fix some corner cases in VarBstrCmp.
Alexandre Julliard
julliard at winehq.org
Tue Mar 24 09:02:01 CDT 2009
Module: wine
Branch: master
Commit: 25c2e283d87b2a8112f14fc7add0dbd37d2cee66
URL: http://source.winehq.org/git/wine.git/?a=commit;h=25c2e283d87b2a8112f14fc7add0dbd37d2cee66
Author: Lei Zhang <thestig at google.com>
Date: Fri Mar 20 15:37:07 2009 -0700
oleaut32: Fix some corner cases in VarBstrCmp.
---
dlls/oleaut32/tests/vartype.c | 20 ++++++++++++++++++++
dlls/oleaut32/vartype.c | 18 +++++++++++++-----
2 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/dlls/oleaut32/tests/vartype.c b/dlls/oleaut32/tests/vartype.c
index eba0bc1..0b4f301 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 6d972a2..7843a7b 100644
--- a/dlls/oleaut32/vartype.c
+++ b/dlls/oleaut32/vartype.c
@@ -6957,9 +6957,8 @@ HRESULT WINAPI VarBstrCmp(BSTR pbstrLeft, BSTR pbstrRight, LCID lcid, DWORD dwFl
if (!pbstrLeft || !*pbstrLeft)
{
- if (!pbstrRight || !*pbstrRight)
- return VARCMP_EQ;
- return VARCMP_LT;
+ if (pbstrRight && *pbstrRight)
+ return VARCMP_LT;
}
else if (!pbstrRight || !*pbstrRight)
return VARCMP_GT;
@@ -6981,8 +6980,17 @@ HRESULT WINAPI VarBstrCmp(BSTR pbstrLeft, BSTR pbstrRight, LCID lcid, DWORD dwFl
}
else
{
- hres = CompareStringW(lcid, dwFlags, pbstrLeft, SysStringLen(pbstrLeft),
- pbstrRight, SysStringLen(pbstrRight)) - 1;
+ unsigned int lenLeft = SysStringLen(pbstrLeft);
+ unsigned int lenRight = SysStringLen(pbstrRight);
+
+ if (lenLeft == 0 || lenRight == 0)
+ {
+ if (lenLeft == 0 && lenRight == 0) return VARCMP_EQ;
+ return lenLeft < lenRight ? VARCMP_LT : VARCMP_GT;
+ }
+
+ hres = CompareStringW(lcid, dwFlags, pbstrLeft, lenLeft,
+ pbstrRight, lenRight) - 1;
TRACE("%d\n", hres);
return hres;
}
More information about the wine-cvs
mailing list