[PATCH v2 4/4] ntdll: Correctly handle shift greater than the type width in 64-bit shift functions.
Zebediah Figura
wine at gitlab.winehq.org
Tue Jul 5 21:39:59 CDT 2022
From: Zebediah Figura <zfigura at codeweavers.com>
Based on a patch by Zhao Yi.
---
dlls/ntdll/large_int.c | 9 +++++++++
dlls/ntdll/tests/large_int.c | 10 +++++-----
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/dlls/ntdll/large_int.c b/dlls/ntdll/large_int.c
index d184426ffcd..2914b97ca70 100644
--- a/dlls/ntdll/large_int.c
+++ b/dlls/ntdll/large_int.c
@@ -815,6 +815,9 @@ LONGLONG __regs__allshl( LONGLONG a, unsigned char b )
const LARGE_INTEGER x = { .QuadPart = a };
LARGE_INTEGER ret;
+ if (b >= 64)
+ return 0;
+
if (b >= 32)
{
ret.HighPart = x.LowPart << (b & 31);
@@ -844,6 +847,9 @@ LONGLONG __regs__allshr( LONGLONG a, unsigned char b )
const LARGE_INTEGER x = { .QuadPart = a };
LARGE_INTEGER ret;
+ if (b >= 64)
+ return (LONGLONG)(x.HighPart >> 31);
+
if (b >= 32)
{
ret.HighPart = x.HighPart >> 31;
@@ -873,6 +879,9 @@ ULONGLONG __regs__aullshr( ULONGLONG a, unsigned char b )
const ULARGE_INTEGER x = { .QuadPart = a };
ULARGE_INTEGER ret;
+ if (b >= 64)
+ return 0;
+
if (b >= 32)
{
ret.HighPart = 0;
diff --git a/dlls/ntdll/tests/large_int.c b/dlls/ntdll/tests/large_int.c
index a8f628ae989..128c83299a9 100644
--- a/dlls/ntdll/tests/large_int.c
+++ b/dlls/ntdll/tests/large_int.c
@@ -519,10 +519,10 @@ static void test_builtins(void)
ok(l == 0xbcdef00000000000ll, "got %#I64x\n", l);
l = call_shift_func(p_allshl, 0x0123456789abcdefll, 88);
- todo_wine ok(!l, "got %#I64x\n", l);
+ ok(!l, "got %#I64x\n", l);
l = call_shift_func(p_allshl, 0x0123456789abcdefll, 0x88);
- todo_wine ok(!l, "got %#I64x\n", l);
+ ok(!l, "got %#I64x\n", l);
l = call_shift_func(p_allshl, 0x0123456789abcdefll, 0x108);
ok(l == 0x23456789abcdef00ll, "got %#I64x\n", l);
@@ -534,7 +534,7 @@ static void test_builtins(void)
ok(l == 0x01234ll, "got %#I64x\n", l);
l = call_shift_func(p_allshr, 0x0123456789abcdefll, 88);
- todo_wine ok(!l, "got %#I64x\n", l);
+ ok(!l, "got %#I64x\n", l);
l = call_shift_func(p_allshr, 0x8123456789abcdefll, 12);
ok(l == 0xfff8123456789abcll, "got %#I64x\n", l);
@@ -543,7 +543,7 @@ static void test_builtins(void)
ok(l == 0xfffffffffff81234ll, "got %#I64x\n", l);
l = call_shift_func(p_allshr, 0x8123456789abcdefll, 88);
- todo_wine ok(l == -1ll, "got %#I64x\n", l);
+ ok(l == -1ll, "got %#I64x\n", l);
l = call_shift_func(p_allshr, 0x8123456789abcdefll, 0x108);
ok(l == 0xff8123456789abcdll, "got %#I64x\n", l);
@@ -555,7 +555,7 @@ static void test_builtins(void)
ok(l == 0x81234ll, "got %#I64x\n", l);
l = call_shift_func(p_aullshr, 0x8123456789abcdefll, 88);
- todo_wine ok(!l, "got %#I64x\n", l);
+ ok(!l, "got %#I64x\n", l);
l = call_shift_func(p_aullshr, 0x8123456789abcdefll, 0x108);
ok(l == 0x8123456789abcdll, "got %#I64x\n", l);
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/375
More information about the wine-devel
mailing list