From: Francis De Brabandere <francisdb@gmail.com> Windows allows any number of leading zeros in hex literals (e.g. &H000000031 = 49). Wine rejected literals with more than 8 hex digits regardless of value. Fix by skipping leading zeros before counting significant digits, so that only actual 32-bit overflow is rejected. --- dlls/vbscript/lex.c | 12 +++++++++--- dlls/vbscript/tests/lang.vbs | 14 ++++++++++++++ dlls/vbscript/tests/run.c | 6 ++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/dlls/vbscript/lex.c b/dlls/vbscript/lex.c index 75838ac586a..2316dfa3505 100644 --- a/dlls/vbscript/lex.c +++ b/dlls/vbscript/lex.c @@ -351,14 +351,20 @@ static int hex_to_int(WCHAR c) static int parse_hex_literal(parser_ctx_t *ctx, LONG *ret) { - const WCHAR *begin = ctx->ptr; + const WCHAR *begin; unsigned l = 0, d; + /* Skip leading zeros — Windows allows any number of them. */ + while(ctx->ptr[1] == '0') + ctx->ptr++; + + begin = ctx->ptr; + while((d = hex_to_int(*++ctx->ptr)) != -1) l = l*16 + d; - if(begin + 9 /* max digits+1 */ < ctx->ptr) { - FIXME("invalid literal\n"); + if(begin + 9 /* max 8 significant digits + 1 */ < ctx->ptr) { + WARN("overflow in hex literal\n"); return 0; } diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index ff34ac8059b..1a5cffd5ca0 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -62,6 +62,20 @@ Call ok(&hfffe& = 65534, "&hfffe& <> -2") Call ok(&hffffffff& = -1, "&hffffffff& <> -1") Call ok((&h01or&h02)=3,"&h01or&h02 <> 3") +' Hex literals with excess leading zeros +Call ok(&H000000031 = 49, "&H000000031 <> 49") +Call ok(&H0000000000000031 = 49, "&H0000000000000031 <> 49") +Call ok(&H00000000000000FF = 255, "&H00000000000000FF <> 255") +Call ok(&H0FFFFFFFF = -1, "&H0FFFFFFFF <> -1") +Call ok(&H007FFFFFFF = 2147483647, "&H007FFFFFFF <> 2147483647") +Call ok(&H000000031& = 49, "&H000000031& <> 49") +Call ok(getVT(&H00000000000000FF) = "VT_I2", "getVT(&H00000000000000FF) is not VT_I2") +Call ok(getVT(&H007FFFFFFF) = "VT_I4", "getVT(&H007FFFFFFF) is not VT_I4") +Call ok(&h0 = 0, "&h0 <> 0") +Call ok(&h0& = 0, "&h0& <> 0") +Call ok(&h00 = 0, "&h00 <> 0") +Call ok(&h000000000 = 0, "&h000000000 <> 0") + ' Test concat when no space and var begins with h hi = "y" x = "x" &hi diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c index 1b46cd49393..8e8feb60b1d 100644 --- a/dlls/vbscript/tests/run.c +++ b/dlls/vbscript/tests/run.c @@ -2857,6 +2857,12 @@ static void test_parse_errors(void) "end if\n", 2, 1, NULL, E_FAIL + }, + { + /* Hex literal overflow */ + L"x = &H100000001\n", + 0, 4, + L"x = &H100000001", S_OK } }; HRESULT hres; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10384