Module: wine Branch: master Commit: 5b22afd3c3348a04c08fb380cd71036d90b6719c URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b22afd3c3348a04c08fb380cd...
Author: Peter Urbanec winehq.org@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; } }