From 584c15723735e065b9ce7ade9166cc5062dedf96 Mon Sep 17 00:00:00 2001 From: Robert North <7ownq0k402@sneakemail.com> Date: Sun, 28 Nov 2004 14:54:26 +0000 Subject: [PATCH] - Ensure that if buffer pointer is null, queue is flushed. - Ensure that correct packets are copied into output buffer. - Use memmove when moving packets within queue, as source and dest will typically overlap. - When moving packets in queue, ensure correct number of packets are moved. --- dlls/wintab32/context.c | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/dlls/wintab32/context.c b/dlls/wintab32/context.c index ba885165337..bc7b9d5f225 100644 --- a/dlls/wintab32/context.c +++ b/dlls/wintab32/context.c @@ -463,12 +463,15 @@ int WINAPI WTPacketsGet(HCTX hCtx, int cMaxPkts, LPVOID lpPkts) TRACE("(%p, %d, %p)\n", hCtx, cMaxPkts, lpPkts); - if (!hCtx || !lpPkts) return 0; + if (!hCtx) + return 0; EnterCriticalSection(&csTablet); context = TABLET_FindOpenContext(hCtx); - TABLET_BlankPacketData(context,lpPkts,cMaxPkts); + + if (lpPkts != NULL) + TABLET_BlankPacketData(context,lpPkts,cMaxPkts); if (context->PacketsQueued == 0) { @@ -476,13 +479,20 @@ int WINAPI WTPacketsGet(HCTX hCtx, int cMaxPkts, LPVOID lpPkts) return 0; } - for(limit = 0; limit < cMaxPkts && limit < context->PacketsQueued; limit++) - ptr=TABLET_CopyPacketData(context ,ptr, &context->PacketQueue[limit]); + limit = min(cMaxPkts,context->PacketsQueued); + + if(ptr != NULL) + { + int i = 0; + for(i = 0; i < limit; i++) + ptr=TABLET_CopyPacketData(context ,ptr, &context->PacketQueue[i]); + } + if (limit < context->PacketsQueued) { - memcpy(context->PacketQueue, &context->PacketQueue[limit], - (context->QueueSize - (limit))*sizeof(WTPACKET)); + memmove(context->PacketQueue, &context->PacketQueue[limit], + (context->PacketsQueued - (limit))*sizeof(WTPACKET)); } context->PacketsQueued -= limit; LeaveCriticalSection(&csTablet); @@ -503,7 +513,8 @@ BOOL WINAPI WTPacket(HCTX hCtx, UINT wSerial, LPVOID lpPkt) TRACE("(%p, %d, %p)\n", hCtx, wSerial, lpPkt); - if (!hCtx) return 0; + if (!hCtx) + return 0; EnterCriticalSection(&csTablet); @@ -518,8 +529,8 @@ BOOL WINAPI WTPacket(HCTX hCtx, UINT wSerial, LPVOID lpPkt) if ((rc+1) < context->QueueSize) { - memcpy(context->PacketQueue, &context->PacketQueue[rc+1], - (context->QueueSize - (rc+1))*sizeof(WTPACKET)); + memmove(context->PacketQueue, &context->PacketQueue[rc+1], + (context->PacketsQueued - (rc+1))*sizeof(WTPACKET)); } context->PacketsQueued -= (rc+1); } @@ -583,7 +594,7 @@ BOOL WINAPI WTGetA(HCTX hCtx, LPLOGCONTEXTA lpLogCtx) EnterCriticalSection(&csTablet); context = TABLET_FindOpenContext(hCtx); - memcpy(lpLogCtx,&context->context,sizeof(LOGCONTEXTA)); + memmove(lpLogCtx,&context->context,sizeof(LOGCONTEXTA)); LeaveCriticalSection(&csTablet); return TRUE; @@ -747,12 +758,12 @@ int WINAPI WTDataGet(HCTX hCtx, UINT wBegin, UINT wEnd, } for (num = bgn; num <= end; num++) - ptr = TABLET_CopyPacketData(context ,ptr, &context->PacketQueue[end]); + ptr = TABLET_CopyPacketData(context ,ptr, &context->PacketQueue[num]); /* remove read packets */ if ((end+1) < context->PacketsQueued) - memcpy( &context->PacketQueue[bgn], &context->PacketQueue[end+1], - (context->PacketsQueued - ((end-bgn)+1)) * sizeof (WTPACKET)); + memmove( &context->PacketQueue[bgn], &context->PacketQueue[end+1], + (context->PacketsQueued - (end+1)) * sizeof (WTPACKET)); context->PacketsQueued -= ((end-bgn)+1); *lpNPkts = ((end-bgn)+1); @@ -777,7 +788,7 @@ int WINAPI WTDataPeek(HCTX hCtx, UINT wBegin, UINT wEnd, TRACE("(%p, %u, %u, %d, %p, %p)\n", hCtx, wBegin, wEnd, cMaxPkts, lpPkts, lpNPkts); - if (!hCtx) return 0; + if (!hCtx || !lpPkts) return 0; EnterCriticalSection(&csTablet); @@ -806,7 +817,7 @@ int WINAPI WTDataPeek(HCTX hCtx, UINT wBegin, UINT wEnd, } for (num = bgn; num <= end; num++) - ptr = TABLET_CopyPacketData(context ,ptr, &context->PacketQueue[end]); + ptr = TABLET_CopyPacketData(context ,ptr, &context->PacketQueue[num]); *lpNPkts = ((end-bgn)+1); LeaveCriticalSection(&csTablet);