Peter Urbanec : wintab32: Avoid NULL pointer dereferences.
Alexandre Julliard
julliard at winehq.org
Wed Jul 21 10:54:49 CDT 2010
Module: wine
Branch: master
Commit: 5b22afd3c3348a04c08fb380cd71036d90b6719c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b22afd3c3348a04c08fb380cd71036d90b6719c
Author: Peter Urbanec <winehq.org at urbanec.net>
Date: Tue Jul 20 23:20:07 2010 +1000
wintab32: Avoid NULL pointer dereferences.
---
dlls/wintab32/context.c | 50 ++++++++++++++++++++++++++++++++++++++++-----
dlls/wintab32/wintab32.c | 28 +++++++++++++++----------
2 files changed, 61 insertions(+), 17 deletions(-)
diff --git a/dlls/wintab32/context.c b/dlls/wintab32/context.c
index 6b52c08..30f0021 100644
--- a/dlls/wintab32/context.c
+++ b/dlls/wintab32/context.c
@@ -155,7 +155,8 @@ static void LoadTablet(void)
{
TRACE("Initializing the tablet to hwnd %p\n",hwndDefault);
gLoaded= TRUE;
- pLoadTabletInfo(hwndDefault);
+ if (pLoadTabletInfo)
+ pLoadTabletInfo(hwndDefault);
}
int TABLET_PostTabletMessage(LPOPENCONTEXT newcontext, UINT msg, WPARAM wParam,
@@ -558,6 +559,11 @@ int WINAPI WTPacketsGet(HCTX hCtx, int cMaxPkts, LPVOID lpPkts)
EnterCriticalSection(&csTablet);
context = TABLET_FindOpenContext(hCtx);
+ if (!context)
+ {
+ LeaveCriticalSection(&csTablet);
+ return 0;
+ }
if (lpPkts != NULL)
TABLET_BlankPacketData(context,lpPkts,cMaxPkts);
@@ -608,6 +614,11 @@ BOOL WINAPI WTPacket(HCTX hCtx, UINT wSerial, LPVOID lpPkt)
EnterCriticalSection(&csTablet);
context = TABLET_FindOpenContext(hCtx);
+ if (!context)
+ {
+ LeaveCriticalSection(&csTablet);
+ return 0;
+ }
rc = TABLET_FindPacket(context ,wSerial, &wtp);
@@ -642,6 +653,12 @@ BOOL WINAPI WTEnable(HCTX hCtx, BOOL fEnable)
EnterCriticalSection(&csTablet);
context = TABLET_FindOpenContext(hCtx);
+ if (!context)
+ {
+ LeaveCriticalSection(&csTablet);
+ return 0;
+ }
+
/* if we want to enable and it is not enabled then */
if(fEnable && !context->enabled)
{
@@ -742,6 +759,12 @@ BOOL WINAPI WTGetA(HCTX hCtx, LPLOGCONTEXTA lpLogCtx)
EnterCriticalSection(&csTablet);
context = TABLET_FindOpenContext(hCtx);
+ if (!context)
+ {
+ LeaveCriticalSection(&csTablet);
+ return 0;
+ }
+
LOGCONTEXTWtoA(&context->context, lpLogCtx);
LeaveCriticalSection(&csTablet);
@@ -761,6 +784,12 @@ BOOL WINAPI WTGetW(HCTX hCtx, LPLOGCONTEXTW lpLogCtx)
EnterCriticalSection(&csTablet);
context = TABLET_FindOpenContext(hCtx);
+ if (!context)
+ {
+ LeaveCriticalSection(&csTablet);
+ return 0;
+ }
+
memmove(lpLogCtx,&context->context,sizeof(LOGCONTEXTW));
LeaveCriticalSection(&csTablet);
@@ -888,7 +917,7 @@ int WINAPI WTPacketsPeek(HCTX hCtx, int cMaxPkts, LPVOID lpPkts)
context = TABLET_FindOpenContext(hCtx);
- if (context->PacketsQueued == 0)
+ if (!context || context->PacketsQueued == 0)
{
LeaveCriticalSection(&csTablet);
return 0;
@@ -923,7 +952,7 @@ int WINAPI WTDataGet(HCTX hCtx, UINT wBegin, UINT wEnd,
context = TABLET_FindOpenContext(hCtx);
- if (context->PacketsQueued == 0)
+ if (!context || context->PacketsQueued == 0)
{
LeaveCriticalSection(&csTablet);
return 0;
@@ -981,7 +1010,7 @@ int WINAPI WTDataPeek(HCTX hCtx, UINT wBegin, UINT wEnd,
context = TABLET_FindOpenContext(hCtx);
- if (context->PacketsQueued == 0)
+ if (!context || context->PacketsQueued == 0)
{
LeaveCriticalSection(&csTablet);
return 0;
@@ -1028,7 +1057,7 @@ BOOL WINAPI WTQueuePacketsEx(HCTX hCtx, UINT *lpOld, UINT *lpNew)
context = TABLET_FindOpenContext(hCtx);
- if (context->PacketsQueued)
+ if (context && context->PacketsQueued)
{
*lpOld = context->PacketQueue[0].pkSerialNumber;
*lpNew = context->PacketQueue[context->PacketsQueued-1].pkSerialNumber;
@@ -1050,14 +1079,18 @@ BOOL WINAPI WTQueuePacketsEx(HCTX hCtx, UINT *lpOld, UINT *lpNew)
int WINAPI WTQueueSizeGet(HCTX hCtx)
{
LPOPENCONTEXT context;
+ int queueSize = 0;
+
TRACE("(%p)\n", hCtx);
if (!hCtx) return 0;
EnterCriticalSection(&csTablet);
context = TABLET_FindOpenContext(hCtx);
+ if (context)
+ queueSize = context->QueueSize;
LeaveCriticalSection(&csTablet);
- return context->QueueSize;
+ return queueSize;
}
/***********************************************************************
@@ -1074,6 +1107,11 @@ BOOL WINAPI WTQueueSizeSet(HCTX hCtx, int nPkts)
EnterCriticalSection(&csTablet);
context = TABLET_FindOpenContext(hCtx);
+ if (!context)
+ {
+ LeaveCriticalSection(&csTablet);
+ return 0;
+ }
context->PacketQueue = HeapReAlloc(GetProcessHeap(), 0,
context->PacketQueue, sizeof(WTPACKET)*nPkts);
diff --git a/dlls/wintab32/wintab32.c b/dlls/wintab32/wintab32.c
index b52b429..53c7523 100644
--- a/dlls/wintab32/wintab32.c
+++ b/dlls/wintab32/wintab32.c
@@ -124,23 +124,29 @@ static LRESULT WINAPI TABLET_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
{
WTPACKET packet;
LPOPENCONTEXT handler;
- pGetCurrentPacket(&packet);
- handler = AddPacketToContextQueue(&packet,(HWND)lParam);
- if (handler && handler->context.lcOptions & CXO_MESSAGES)
- TABLET_PostTabletMessage(handler, _WT_PACKET(handler->context.lcMsgBase),
- (WPARAM)packet.pkSerialNumber,
- (LPARAM)handler->handle, FALSE);
+ if (pGetCurrentPacket)
+ {
+ pGetCurrentPacket(&packet);
+ handler = AddPacketToContextQueue(&packet,(HWND)lParam);
+ if (handler && handler->context.lcOptions & CXO_MESSAGES)
+ TABLET_PostTabletMessage(handler, _WT_PACKET(handler->context.lcMsgBase),
+ (WPARAM)packet.pkSerialNumber,
+ (LPARAM)handler->handle, FALSE);
+ }
break;
}
case WT_PROXIMITY:
{
WTPACKET packet;
LPOPENCONTEXT handler;
- pGetCurrentPacket(&packet);
- handler = AddPacketToContextQueue(&packet,(HWND)wParam);
- if (handler)
- TABLET_PostTabletMessage(handler, WT_PROXIMITY,
- (WPARAM)handler->handle, lParam, TRUE);
+ if (pGetCurrentPacket)
+ {
+ pGetCurrentPacket(&packet);
+ handler = AddPacketToContextQueue(&packet,(HWND)wParam);
+ if (handler)
+ TABLET_PostTabletMessage(handler, WT_PROXIMITY,
+ (WPARAM)handler->handle, lParam, TRUE);
+ }
break;
}
}
More information about the wine-cvs
mailing list