From 1566b1505e6c87f878e9fad9e3c06a21ad1dcc41 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 10 Jul 2007 15:03:19 +0000 Subject: [PATCH] Don't leak the readahead buffer if win32 rwops file open fails. --- src/file/SDL_rwops.c | 19 ++++++++++++------- test/Makefile.in | 5 ++++- test/README | 1 + 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/file/SDL_rwops.c b/src/file/SDL_rwops.c index 2a510ee53..c219b5570 100644 --- a/src/file/SDL_rwops.c +++ b/src/file/SDL_rwops.c @@ -59,12 +59,7 @@ static int SDLCALL win32_file_open(SDL_RWops *context, const char *filename, con 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 @@ static int SDLCALL win32_file_open(SDL_RWops *context, const char *filename, con 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 @@ static int SDLCALL win32_file_open(SDL_RWops *context, const char *filename, con 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 @@ static int SDLCALL win32_file_open(SDL_RWops *context, const char *filename, con 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) diff --git a/test/Makefile.in b/test/Makefile.in index 7d5bb8b73..898ffb612 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -7,7 +7,7 @@ EXE = @EXE@ 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 @@ testpalette$(EXE): $(srcdir)/testpalette.c 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) diff --git a/test/README b/test/README index 9cf5659c7..55d35c762 100644 --- a/test/README +++ b/test/README @@ -24,6 +24,7 @@ These are test programs for the SDL library: 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