Validate access even if wrap past address 0 for IsBadStringPtr[A|W]

and IsBad[Read|Write]Ptr.
This commit is contained in:
Guy Albertelli 2000-10-13 23:06:13 +00:00 committed by Alexandre Julliard
parent 1563abe8ec
commit b111b6d28f

View file

@ -85,9 +85,11 @@ static CRITICAL_SECTION csVirtual = CRITICAL_SECTION_INIT;
/* These are always the same on an i386, and it will be faster this way */ /* These are always the same on an i386, and it will be faster this way */
# define page_mask 0xfff # define page_mask 0xfff
# define page_shift 12 # define page_shift 12
# define page_size 0x1000
#else #else
static UINT page_shift; static UINT page_shift;
static UINT page_mask; static UINT page_mask;
static UINT page_size;
#endif /* __i386__ */ #endif /* __i386__ */
#define granularity_mask 0xffff /* Allocation granularity (usually 64k) */ #define granularity_mask 0xffff /* Allocation granularity (usually 64k) */
@ -578,8 +580,6 @@ static LPVOID map_image( HANDLE hmapping, int fd, char *base, DWORD total_size,
#ifndef page_mask #ifndef page_mask
DECL_GLOBAL_CONSTRUCTOR(VIRTUAL_Init) DECL_GLOBAL_CONSTRUCTOR(VIRTUAL_Init)
{ {
DWORD page_size;
# ifdef HAVE_GETPAGESIZE # ifdef HAVE_GETPAGESIZE
page_size = getpagesize(); page_size = getpagesize();
# else # else
@ -1163,18 +1163,21 @@ BOOL WINAPI IsBadReadPtr(
LPCVOID ptr, /* Address of memory block */ LPCVOID ptr, /* Address of memory block */
UINT size ) /* Size of block */ UINT size ) /* Size of block */
{ {
if (!size) return FALSE; /* handle 0 size case w/o reference */
__TRY __TRY
{ {
volatile const char *p = ptr; volatile const char *p = ptr;
volatile const char *end = p + size - 1;
char dummy; char dummy;
UINT count = size;
while (p < end) while (count > page_size)
{ {
dummy = *p; dummy = *p;
p += page_mask + 1; p += page_size;
count -= page_size;
} }
dummy = *end; dummy = p[0];
dummy = p[count - 1];
} }
__EXCEPT(page_fault) { return TRUE; } __EXCEPT(page_fault) { return TRUE; }
__ENDTRY __ENDTRY
@ -1193,17 +1196,20 @@ BOOL WINAPI IsBadWritePtr(
LPVOID ptr, /* [in] Address of memory block */ LPVOID ptr, /* [in] Address of memory block */
UINT size ) /* [in] Size of block in bytes */ UINT size ) /* [in] Size of block in bytes */
{ {
if (!size) return FALSE; /* handle 0 size case w/o reference */
__TRY __TRY
{ {
volatile char *p = ptr; volatile char *p = ptr;
volatile char *end = p + size - 1; UINT count = size;
while (p < end) while (count > page_size)
{ {
*p |= 0; *p |= 0;
p += page_mask + 1; p += page_size;
count -= page_size;
} }
*end |= 0; p[0] |= 0;
p[count - 1] |= 0;
} }
__EXCEPT(page_fault) { return TRUE; } __EXCEPT(page_fault) { return TRUE; }
__ENDTRY __ENDTRY
@ -1266,7 +1272,7 @@ BOOL WINAPI IsBadStringPtrA(
__TRY __TRY
{ {
volatile const char *p = str; volatile const char *p = str;
while (p < str + max) if (!*p++) break; while (p != str + max) if (!*p++) break;
} }
__EXCEPT(page_fault) { return TRUE; } __EXCEPT(page_fault) { return TRUE; }
__ENDTRY __ENDTRY
@ -1283,7 +1289,7 @@ BOOL WINAPI IsBadStringPtrW( LPCWSTR str, UINT max )
__TRY __TRY
{ {
volatile const WCHAR *p = str; volatile const WCHAR *p = str;
while (p < str + max) if (!*p++) break; while (p != str + max) if (!*p++) break;
} }
__EXCEPT(page_fault) { return TRUE; } __EXCEPT(page_fault) { return TRUE; }
__ENDTRY __ENDTRY
@ -1301,7 +1307,7 @@ BOOL WINAPI IsBadStringPtrW( LPCWSTR str, UINT max )
* NULL: Failure * NULL: Failure
*/ */
HANDLE WINAPI CreateFileMappingA( HANDLE WINAPI CreateFileMappingA(
HFILE hFile, /* [in] Handle of file to map */ HANDLE hFile, /* [in] Handle of file to map */
SECURITY_ATTRIBUTES *sa, /* [in] Optional security attributes*/ SECURITY_ATTRIBUTES *sa, /* [in] Optional security attributes*/
DWORD protect, /* [in] Protection for mapping object */ DWORD protect, /* [in] Protection for mapping object */
DWORD size_high, /* [in] High-order 32 bits of object size */ DWORD size_high, /* [in] High-order 32 bits of object size */
@ -1361,7 +1367,7 @@ HANDLE WINAPI CreateFileMappingA(
* CreateFileMappingW (KERNEL32.47) * CreateFileMappingW (KERNEL32.47)
* See CreateFileMappingA * See CreateFileMappingA
*/ */
HANDLE WINAPI CreateFileMappingW( HFILE hFile, LPSECURITY_ATTRIBUTES sa, HANDLE WINAPI CreateFileMappingW( HANDLE hFile, LPSECURITY_ATTRIBUTES sa,
DWORD protect, DWORD size_high, DWORD protect, DWORD size_high,
DWORD size_low, LPCWSTR name ) DWORD size_low, LPCWSTR name )
{ {