Convert some invalid offsets in GetWindowLong16 into valid offsets.
This commit is contained in:
parent
0f9013f7e0
commit
3fead8fa3b
|
@ -1873,6 +1873,24 @@ static LONG WIN_GetWindowLong( HWND hwnd, INT offset, WINDOWPROCTYPE type )
|
||||||
{
|
{
|
||||||
if (offset > wndPtr->cbWndExtra - sizeof(LONG))
|
if (offset > wndPtr->cbWndExtra - sizeof(LONG))
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Some programs try to access last element from 16 bit
|
||||||
|
* code using illegal offset value. Hopefully this is
|
||||||
|
* what those programs really expect.
|
||||||
|
*/
|
||||||
|
if (type == WIN_PROC_16 &&
|
||||||
|
wndPtr->cbWndExtra >= 4 &&
|
||||||
|
offset == wndPtr->cbWndExtra - sizeof(WORD))
|
||||||
|
{
|
||||||
|
INT offset2 = wndPtr->cbWndExtra - sizeof(LONG);
|
||||||
|
|
||||||
|
ERR( "- replaced invalid offset %d with %d\n",
|
||||||
|
offset, offset2 );
|
||||||
|
|
||||||
|
retvalue = *(LONG *)(((char *)wndPtr->wExtra) + offset2);
|
||||||
|
WIN_ReleasePtr( wndPtr );
|
||||||
|
return retvalue;
|
||||||
|
}
|
||||||
WARN("Invalid offset %d\n", offset );
|
WARN("Invalid offset %d\n", offset );
|
||||||
WIN_ReleasePtr( wndPtr );
|
WIN_ReleasePtr( wndPtr );
|
||||||
SetLastError( ERROR_INVALID_INDEX );
|
SetLastError( ERROR_INVALID_INDEX );
|
||||||
|
|
Loading…
Reference in New Issue