dlls/x11drv/wintab.c::WTInfoA() -- fixes page fault crashes.
Robert North
7ownq0k402 at sneakemail.com
Wed Oct 20 17:50:37 CDT 2004
It allows WTInfoA to be called with lpOutput == null, as spec. This
fixes crashes in some apps, and tidies the code up a little.
This is my first patch, so its quite possible I've overlooked some
style/QA issue in posting.
In particular....
The patch was generated with subversion.
If this patch doesn't apply as normal, please tell me.
ChangeLog:
Fix WTInfoA in wintab.c so it can now take lpOutput == NULL, as per
standard.
-------------- next part --------------
Index: dlls/x11drv/wintab.c
===================================================================
--- dlls/x11drv/wintab.c (revision 119)
+++ dlls/x11drv/wintab.c (revision 123)
@@ -746,7 +746,12 @@
int static inline CopyTabletData(LPVOID target, LPVOID src, INT size)
{
- memcpy(target,src,size);
+ /*
+ * It is valid to call CopyTabletData with NULL.
+ * This handles the WTInfo() case where lpOutput is null.
+ */
+ if(target != NULL)
+ memcpy(target,src,size);
return(size);
}
@@ -755,6 +760,14 @@
*/
UINT X11DRV_WTInfoA(UINT wCategory, UINT nIndex, LPVOID lpOutput)
{
+ /*
+ * It is valid to call WTInfoA with lpOutput == NULL, as per standard.
+ * lpOutput == NULL signifies the user only wishes
+ * to find the size of the data.
+ * NOTE:
+ * From now on use CopyTabletData to fill lpOutput. memcpy will break
+ * the code.
+ */
int rc = 0;
LPWTI_CURSORS_INFO tgtcursor;
TRACE("(%u, %u, %p)\n", wCategory, nIndex, lpOutput);
@@ -799,9 +812,8 @@
switch (nIndex)
{
case 0:
- memcpy(lpOutput, &gSysContext,
+ rc = CopyTabletData(lpOutput, &gSysContext,
sizeof(LOGCONTEXTA));
- rc = sizeof(LOGCONTEXTA);
break;
case CTX_NAME:
rc = CopyTabletData(lpOutput, &gSysContext.lcName,
@@ -988,8 +1000,8 @@
sizeof(BYTE)*32);
break;
case CSR_NPBTNMARKS:
- memcpy(lpOutput,&tgtcursor->NPBTNMARKS,sizeof(UINT)*2);
- rc = sizeof(UINT)*2;
+ rc = CopyTabletData(lpOutput,&tgtcursor->NPBTNMARKS,
+ sizeof(UINT)*2);
break;
case CSR_NPBUTTON:
rc = CopyTabletData(lpOutput,&tgtcursor->NPBUTTON,
@@ -1004,8 +1016,8 @@
sizeof(BYTE));
break;
case CSR_TPBTNMARKS:
- memcpy(lpOutput,&tgtcursor->TPBTNMARKS,sizeof(UINT)*2);
- rc = sizeof(UINT)*2;
+ rc = CopyTabletData(lpOutput,&tgtcursor->TPBTNMARKS,
+ sizeof(UINT)*2);
break;
case CSR_TPRESPONSE:
FIXME("Not returning CSR_TPRESPONSE correctly\n");
@@ -1014,10 +1026,9 @@
case CSR_PHYSID:
{
DWORD id;
- rc = CopyTabletData(&id,&tgtcursor->PHYSID,
- sizeof(DWORD));
+ id = tgtcursor->PHYSID;
id += (wCategory - WTI_CURSORS);
- memcpy(lpOutput,&id,sizeof(DWORD));
+ rc = CopyTabletData(lpOutput,&id,sizeof(DWORD));
}
break;
case CSR_MODE:
@@ -1121,14 +1132,14 @@
*/
break;
case DVC_ORIENTATION:
- memcpy(lpOutput,&gSysDevice.ORIENTATION,sizeof(AXIS)*3);
- rc = sizeof(AXIS)*3;
+ rc = CopyTabletData(lpOutput,&gSysDevice.ORIENTATION,
+ sizeof(AXIS)*3);
break;
case DVC_ROTATION:
rc = 0; /* unsupported */
/*
- memcpy(lpOutput,&gSysDevice.ROTATION,sizeof(AXIS)*3);
- rc = sizeof(AXIS)*3;
+ rc = CopyTabletData(lpOutput,&gSysDevice.ROTATION,
+ sizeof(AXIS)*3);
*/
break;
case DVC_PNPID:
More information about the wine-patches
mailing list