changeset 4035:3ccd06fc22e5 SDL-1.2

Don't leak the readahead buffer if win32 rwops file open fails.
author Ryan C. Gordon <icculus@icculus.org>
date Tue, 10 Jul 2007 15:03:19 +0000
parents 4ea82f5e7e2c
children eb60dd682e5e
files src/file/SDL_rwops.c test/Makefile.in test/README
diffstat 3 files changed, 17 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/file/SDL_rwops.c	Tue Jul 10 14:16:44 2007 +0000
+++ b/src/file/SDL_rwops.c	Tue Jul 10 15:03:19 2007 +0000
@@ -59,12 +59,7 @@
 		return -1;
 		
 	context->hidden.win32io.h = INVALID_HANDLE_VALUE; /* mark this as unusable */
-
-	context->hidden.win32io.buffer.data = (char *)SDL_malloc(READAHEAD_BUFFER_SIZE);
-	if (!context->hidden.win32io.buffer.data) {
-		SDL_OutOfMemory();
-		return -1;
-	}
+	context->hidden.win32io.buffer.data = NULL;
 	context->hidden.win32io.buffer.size = 0;
 	context->hidden.win32io.buffer.left = 0;
 
@@ -84,6 +79,12 @@
 	if (!r_right && !w_right) /* inconsistent mode */
 		return -1; /* failed (invalid call)*/
 
+	context->hidden.win32io.buffer.data = (char *)SDL_malloc(READAHEAD_BUFFER_SIZE);
+	if (!context->hidden.win32io.buffer.data) {
+		SDL_OutOfMemory();
+		return -1;
+	}
+
 #ifdef _WIN32_WCE
 	{
 		size_t size = SDL_strlen(filename)+1;
@@ -92,6 +93,8 @@
 		if ( MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, size) == 0 ) {
 			SDL_SetError("Unable to convert filename to Unicode");
 			SDL_stack_free(filenameW);
+			SDL_free(context->hidden.win32io.buffer.data);
+			context->hidden.win32io.buffer.data = NULL;
 			return -1;
 		}
 		h = CreateFile(filenameW, (w_right|r_right), (w_right)? 0 : FILE_SHARE_READ, 
@@ -111,11 +114,13 @@
 
 	if (h==INVALID_HANDLE_VALUE) {
 		SDL_SetError("Couldn't open %s",filename);
+		SDL_free(context->hidden.win32io.buffer.data);
+		context->hidden.win32io.buffer.data = NULL;
 		return -2; /* failed (CreateFile) */
 	}
 	context->hidden.win32io.h = h;
 	context->hidden.win32io.append = a_mode;
-	
+
 	return 0; /* ok */
 }
 static int SDLCALL win32_file_seek(SDL_RWops *context, int offset, int whence)
--- a/test/Makefile.in	Tue Jul 10 14:16:44 2007 +0000
+++ b/test/Makefile.in	Tue Jul 10 15:03:19 2007 +0000
@@ -7,7 +7,7 @@
 CFLAGS  = @CFLAGS@
 LIBS	= @LIBS@
 
-TARGETS = checkkeys$(EXE) graywin$(EXE) loopwave$(EXE) testalpha$(EXE) testbitmap$(EXE) testblitspeed$(EXE) testcdrom$(EXE) testcursor$(EXE) testdyngl$(EXE) testerror$(EXE) testfile$(EXE) testgamma$(EXE) testgl$(EXE) testhread$(EXE) testiconv$(EXE) testjoystick$(EXE) testkeys$(EXE) testlock$(EXE) testoverlay2$(EXE) testoverlay$(EXE) testpalette$(EXE) testplatform$(EXE) testsem$(EXE) testsprite$(EXE) testtimer$(EXE) testver$(EXE) testvidinfo$(EXE) testwin$(EXE) testwm$(EXE) threadwin$(EXE) torturethread$(EXE) testloadso$(EXE)
+TARGETS = checkkeys$(EXE) graywin$(EXE) loopwave$(EXE) testalpha$(EXE) testbitmap$(EXE) testblitspeed$(EXE) testcdrom$(EXE) testcursor$(EXE) testdyngl$(EXE) testerror$(EXE) testfile$(EXE) testgamma$(EXE) testgl$(EXE) testhread$(EXE) testiconv$(EXE) testjoystick$(EXE) testkeys$(EXE) testlock$(EXE) testoverlay2$(EXE) testoverlay$(EXE) testpalette$(EXE) testplatform$(EXE) testrwops$(EXE) testsem$(EXE) testsprite$(EXE) testtimer$(EXE) testver$(EXE) testvidinfo$(EXE) testwin$(EXE) testwm$(EXE) threadwin$(EXE) torturethread$(EXE) testloadso$(EXE)
 
 all: $(TARGETS)
 
@@ -77,6 +77,9 @@
 testplatform$(EXE): $(srcdir)/testplatform.c
 	$(CC) -o $@ $? $(CFLAGS) $(LIBS)
 
+testrwops$(EXE): $(srcdir)/testrwops.c
+	$(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@
+
 testsem$(EXE): $(srcdir)/testsem.c
 	$(CC) -o $@ $? $(CFLAGS) $(LIBS)
 
--- a/test/README	Tue Jul 10 14:16:44 2007 +0000
+++ b/test/README	Tue Jul 10 15:03:19 2007 +0000
@@ -24,6 +24,7 @@
 	testoverlay2	Tests the overlay flickering/scaling during playback.
 	testpalette	Tests palette color cycling
 	testplatform	Tests types, endianness and cpu capabilities
+	testrwops	Stress-test file i/o API
 	testsem		Tests SDL's semaphore implementation
 	testsprite	Example of fast sprite movement on the screen
 	testtimer	Test the timer facilities