Better fix for bug 936

--HG--
branch : SDL-1.2
This commit is contained in:
Sam Lantinga 2010-07-18 10:28:57 -07:00
parent a213c9590f
commit a1cee1cf8c

View file

@ -78,7 +78,7 @@ static int generate_rowbytes(int src_w, int dst_w, int bpp)
int i; int i;
int pos, inc; int pos, inc;
unsigned char *eip, *end; unsigned char *eip, *fence;
unsigned char load, store; unsigned char load, store;
/* See if we need to regenerate the copy buffer */ /* See if we need to regenerate the copy buffer */
@ -115,15 +115,21 @@ static int generate_rowbytes(int src_w, int dst_w, int bpp)
pos = 0x10000; pos = 0x10000;
inc = (src_w << 16) / dst_w; inc = (src_w << 16) / dst_w;
eip = copy_row; eip = copy_row;
end = copy_row+sizeof(copy_row); fence = copy_row+sizeof(copy_row)-2;
for ( i=0; i<dst_w && eip < end; ++i ) { for ( i=0; i<dst_w && eip < end; ++i ) {
while ( pos >= 0x10000L ) { while ( pos >= 0x10000L ) {
if ( eip == fence ) {
return -1;
}
if ( bpp == 2 ) { if ( bpp == 2 ) {
*eip++ = PREFIX16; *eip++ = PREFIX16;
} }
*eip++ = load; *eip++ = load;
pos -= 0x10000L; pos -= 0x10000L;
} }
if ( eip == fence ) {
return -1;
}
if ( bpp == 2 ) { if ( bpp == 2 ) {
*eip++ = PREFIX16; *eip++ = PREFIX16;
} }
@ -132,11 +138,6 @@ static int generate_rowbytes(int src_w, int dst_w, int bpp)
} }
*eip++ = RETURN; *eip++ = RETURN;
/* Verify that we didn't overflow (too late!!!) */
if ( i < dst_w ) {
SDL_SetError("Copy buffer too small");
return(-1);
}
#ifdef HAVE_MPROTECT #ifdef HAVE_MPROTECT
/* Make the code executable but not writeable */ /* Make the code executable but not writeable */
if ( mprotect(copy_row, sizeof(copy_row), PROT_READ|PROT_EXEC) < 0 ) { if ( mprotect(copy_row, sizeof(copy_row), PROT_READ|PROT_EXEC) < 0 ) {