Jacek Caban : user32: Make sure that passed window handle is scroll control before accessing wExtra in SCROLL_GetInternalInfo.

Alexandre Julliard julliard at winehq.org
Thu Sep 20 13:45:34 CDT 2018


Module: wine
Branch: master
Commit: b8ef42c9fd165da5c31d8f68f2ae39b77e9101f5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b8ef42c9fd165da5c31d8f68f2ae39b77e9101f5

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Sep 20 16:48:55 2018 +0200

user32: Make sure that passed window handle is scroll control before accessing wExtra in SCROLL_GetInternalInfo.

Fixes memory corruption in Office 2016.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/scroll.c       |  3 ++-
 dlls/user32/tests/scroll.c | 21 +++++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/dlls/user32/scroll.c b/dlls/user32/scroll.c
index 1c127fb..30a0cd9 100644
--- a/dlls/user32/scroll.c
+++ b/dlls/user32/scroll.c
@@ -159,7 +159,8 @@ static SCROLLBAR_INFO *SCROLL_GetInternalInfo( HWND hwnd, INT nBar, BOOL alloc )
             if (wndPtr->pScroll) infoPtr = &((LPWINSCROLLBAR_INFO)wndPtr->pScroll)->vert;
             break;
         case SB_CTL:
-            infoPtr = (SCROLLBAR_INFO *)wndPtr->wExtra;
+            if (get_class_winproc( wndPtr->class ) == BUILTIN_WINPROC( WINPROC_SCROLLBAR ))
+                infoPtr = (SCROLLBAR_INFO *)wndPtr->wExtra;
             break;
         case SB_BOTH:
             WARN("with SB_BOTH\n");
diff --git a/dlls/user32/tests/scroll.c b/dlls/user32/tests/scroll.c
index 291d11a..c19607d 100644
--- a/dlls/user32/tests/scroll.c
+++ b/dlls/user32/tests/scroll.c
@@ -114,6 +114,14 @@ static void test_EnableScrollBar(void)
     ok( ret, "The scrollbar should be enabled.\n" );
     ok( IsWindowEnabled( hScroll ), "The scrollbar window should be enabled.\n" );
 
+    SetLastError( 0xdeadbeef );
+    ret = EnableScrollBar( mainwnd, SB_CTL, ESB_ENABLE_BOTH );
+    ok( !ret, "EnableScrollBar should fail.\n" );
+    todo_wine
+    ok( GetLastError() == ERROR_INVALID_PARAMETER
+        || broken(GetLastError() == 0xdeadbeef), /* winxp */
+        "GetLastError() = %u\n", GetLastError() );
+
     /* disable window, try to re-enable */
     ret = EnableWindow( hScroll, FALSE );
     ok( !ret, "got %d\n", ret );
@@ -170,6 +178,16 @@ static void test_SetScrollPos(void)
     ret = GetScrollPos( hScroll, SB_CTL);
     ok( ret == 30, "The position should not be equal to zero\n");
 
+    SetLastError( 0xdeadbeef );
+    ret = SetScrollPos( mainwnd, SB_CTL, 30, TRUE );
+    ok( !ret, "The position should not be set.\n" );
+    ok( GetLastError() == 0xdeadbeef, "GetLastError() = %u\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    ret = GetScrollPos( mainwnd, SB_CTL );
+    ok( !ret, "The position should be equal to zero\n");
+    ok( GetLastError() == 0xdeadbeef, "GetLastError() = %u\n", GetLastError() );
+
     DestroyWindow(hScroll);
     DestroyWindow(mainwnd);
 }
@@ -192,6 +210,9 @@ static void test_ShowScrollBar(void)
     ret = ShowScrollBar( NULL, SB_CTL, TRUE );
     ok( !ret, "The ShowScrollBar() should failed.\n" );
 
+    ret = ShowScrollBar( mainwnd, SB_CTL, TRUE );
+    ok( ret, "The ShowScrollBar() should not fail.\n" );
+
     DestroyWindow(hScroll);
     DestroyWindow(mainwnd);
 }




More information about the wine-cvs mailing list