Piotr Caban : oleaut32: Ignore underflows in VarR8FromStr.
Alexandre Julliard
julliard at winehq.org
Tue Nov 7 15:30:21 CST 2017
Module: wine
Branch: master
Commit: 409bafcc73d05adb4e67882f4ecdfc22632389dc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=409bafcc73d05adb4e67882f4ecdfc22632389dc
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Nov 7 16:22:57 2017 +0100
oleaut32: Ignore underflows in VarR8FromStr.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/oleaut32/tests/vartest.c | 5 +++++
dlls/oleaut32/tests/vartype.c | 1 +
dlls/oleaut32/variant.c | 8 ++++----
3 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/dlls/oleaut32/tests/vartest.c b/dlls/oleaut32/tests/vartest.c
index d8a6ebf..429ffbb 100644
--- a/dlls/oleaut32/tests/vartest.c
+++ b/dlls/oleaut32/tests/vartest.c
@@ -1947,6 +1947,11 @@ static void test_VarNumFromParseNum(void)
/* Currency is preferred over decimal */
SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_CY|VTBIT_DECIMAL); EXPECT_CY(1);
+
+ /* Underflow test */
+ SETRGB(0, 1); CONVERT(1,0,NUMPRS_EXPONENT,1,0,-94938484, VTBIT_R4); EXPECT_R4(0.0);
+ SETRGB(0, 1); CONVERT(1,0,NUMPRS_EXPONENT,1,0,-94938484, VTBIT_R8); EXPECT_R8(0.0);
+ SETRGB(0, 1); CONVERT(1,0,NUMPRS_EXPONENT,1,0,-94938484, VTBIT_CY); EXPECT_CY(0);
}
diff --git a/dlls/oleaut32/tests/vartype.c b/dlls/oleaut32/tests/vartype.c
index be6ec91..6348fee 100644
--- a/dlls/oleaut32/tests/vartype.c
+++ b/dlls/oleaut32/tests/vartype.c
@@ -2729,6 +2729,7 @@ static void test_VarR8FromStr(void)
CONVERT_STR(VarR8FromStr,"0.5",LOCALE_NOUSEROVERRIDE); EXPECT(0.5);
CONVERT_STR(VarR8FromStr,"0.6",LOCALE_NOUSEROVERRIDE); EXPECT(0.6);
CONVERT_STR(VarR8FromStr,"1.5",LOCALE_NOUSEROVERRIDE); EXPECT(1.5);
+ CONVERT_STR(VarR8FromStr,"1e-94938484",LOCALE_NOUSEROVERRIDE); EXPECT(0);
/* We already have exhaustive tests for number parsing, so skip those tests here */
}
diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c
index a760a65..a1feb27 100644
--- a/dlls/oleaut32/variant.c
+++ b/dlls/oleaut32/variant.c
@@ -2392,8 +2392,8 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig,
{
if (whole < dblMinimums[10] && whole != 0)
{
- dwVtBits &= ~(VTBIT_R4|VTBIT_R8|VTBIT_CY); /* Underflow */
- bOverflow = TRUE;
+ whole = 0; /* ignore underflow */
+ divisor10 = 0;
break;
}
whole = whole / dblMultipliers[10];
@@ -2403,8 +2403,8 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig,
{
if (whole < dblMinimums[divisor10] && whole != 0)
{
- dwVtBits &= ~(VTBIT_R4|VTBIT_R8|VTBIT_CY); /* Underflow */
- bOverflow = TRUE;
+ whole = 0; /* ignore underflow */
+ divisor10 = 0;
}
else
whole = whole / dblMultipliers[divisor10];
More information about the wine-cvs
mailing list