From 697ab9f7d8391d88e4d292427e9fc4cbb399a62a Mon Sep 17 00:00:00 2001 From: johns <> Date: Thu, 8 Feb 2001 21:49:09 +0000 Subject: [PATCH] Fixed memory corruption, if cursor rectangle is 0,0. --- src/video/cursor.cpp | 47 +++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/src/video/cursor.cpp b/src/video/cursor.cpp index bf7fbeaa5..666b87bb1 100644 --- a/src/video/cursor.cpp +++ b/src/video/cursor.cpp @@ -151,7 +151,7 @@ local void (*SaveCursorBackground)(int,int,int,int); /// Function pointer: Load background behind cursor local void (*LoadCursorBackground)(int,int,int,int); -/* Function pointer: Save rectangle behind cursor +/** Function pointer: Save rectangle behind cursor ** @param x Screen X pixels coordinate for left-top corner. ** @param y Screen Y pixels coordinate for left-top corner. ** @param w Width in pixels for rectangle starting at left-top. @@ -161,7 +161,7 @@ local void (*LoadCursorBackground)(int,int,int,int); */ local void (*SaveCursorRectangle)(int x,int y,int w,int h); -/* Function pointer: Load rectangle behind cursor +/** Function pointer: Load rectangle behind cursor ** @param x Screen X pixels coordinate. ** @param y Screen Y pixels coordinate. ** @param w Width in pixels. @@ -179,7 +179,7 @@ local void (*LoadCursorRectangle)(int x,int y,int w,int h); sp=OldCursorRectangle; \ dp=video+y*VideoWidth+x; \ memcpy(dp,sp,w*sizeof(memtype)); \ - if ( --h ) { \ + if ( h ) { \ sp+=w; \ dp+=VideoWidth; \ while( --h ) { \ @@ -212,56 +212,72 @@ local void (*LoadCursorRectangle)(int x,int y,int w,int h); ** (See description function pointer LoadCursorRectangle) */ local void LoadCursorRectangle8(int x,int y,int w,int h) { - LOADCURSORRECTANGLE(VideoMemory8,VMemType8,x,y,w,h); + if( w && h ) { + LOADCURSORRECTANGLE(VideoMemory8,VMemType8,x,y,w,h); + } } /** Restore cursor rectangle for 16bpp frame buffer. ** (See description function pointer LoadCursorRectangle) */ local void LoadCursorRectangle16(int x,int y,int w,int h) { - LOADCURSORRECTANGLE(VideoMemory16,VMemType16,x,y,w,h); + if( w && h ) { + LOADCURSORRECTANGLE(VideoMemory16,VMemType16,x,y,w,h); + } } /** Restore cursor rectangle for 24bpp frame buffer. ** (See description function pointer LoadCursorRectangle) */ local void LoadCursorRectangle24(int x,int y,int w,int h) { - LOADCURSORRECTANGLE(VideoMemory24,VMemType24,x,y,w,h); + if( w && h ) { + LOADCURSORRECTANGLE(VideoMemory24,VMemType24,x,y,w,h); + } } /** Restore cursor rectangle for 32bpp frame buffer. ** (See description function pointer LoadCursorRectangle) */ local void LoadCursorRectangle32(int x,int y,int w,int h) { - LOADCURSORRECTANGLE(VideoMemory32,VMemType32,x,y,w,h); + if( w && h ) { + LOADCURSORRECTANGLE(VideoMemory32,VMemType32,x,y,w,h); + } } /** Save cursor rectangle for 8bpp frame buffer. ** (See description function pointer SaveCursorRectangle) */ local void SaveCursorRectangle8(int x,int y,int w,int h) { - SAVECURSORRECTANGLE(VideoMemory8,VMemType8,x,y,w,h); + if( w && h ) { + SAVECURSORRECTANGLE(VideoMemory8,VMemType8,x,y,w,h); + } } /** Save cursor rectangle for 16bpp frame buffer. ** (See description function pointer SaveCursorRectangle) */ local void SaveCursorRectangle16(int x,int y,int w,int h) { - SAVECURSORRECTANGLE(VideoMemory16,VMemType16,x,y,w,h); + if( w && h ) { + SAVECURSORRECTANGLE(VideoMemory16,VMemType16,x,y,w,h); + } } /** Save cursor rectangle for 24bpp frame buffer. ** (See description function pointer SaveCursorRectangle) */ local void SaveCursorRectangle24(int x,int y,int w,int h) { - SAVECURSORRECTANGLE(VideoMemory24,VMemType24,x,y,w,h); + if( w && h ) { + SAVECURSORRECTANGLE(VideoMemory24,VMemType24,x,y,w,h); + } } /** Save cursor rectangle for 32bpp frame buffer. ** (See description function pointer SaveCursorRectangle) */ local void SaveCursorRectangle32(int x,int y,int w,int h) { - SAVECURSORRECTANGLE(VideoMemory32,VMemType32,x,y,w,h); + if( w && h ) { + SAVECURSORRECTANGLE(VideoMemory32,VMemType32,x,y,w,h); + } } /** @@ -728,7 +744,7 @@ local void DrawBuildingCursor(void) break; case UnitTypeFly: default: - DebugLevel1(__FUNCTION__": Were moves this unit?\n"); + DebugLevel1Fn("Were moves this unit?\n"); return; } @@ -896,7 +912,10 @@ global int HideAnyCursor(void) global void InitCursor(void) { int memsize; - free( OldCursorRectangle ); // memory of possible previous video-setting? + + if( OldCursorRectangle ) { // memory of possible previous video-setting? + free( OldCursorRectangle ); + } switch( VideoDepth ) { case 8: @@ -928,7 +947,7 @@ global void InitCursor(void) LoadCursorRectangle=LoadCursorRectangle32; break; default: - DebugLevel0(__FUNCTION__": unsupported %d bpp\n",VideoDepth); + DebugLevel0Fn("unsupported %d bpp\n",VideoDepth); abort(); } OldCursorRectangle=malloc((2*VideoWidth+2*(VideoHeight-2))*memsize);