Skip to content

Commit

Permalink
Don't leak the readahead buffer if win32 rwops file open fails.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Jul 10, 2007
1 parent 5b900fe commit 1566b15
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 8 deletions.
19 changes: 12 additions & 7 deletions src/file/SDL_rwops.c
Expand Up @@ -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;

Expand All @@ -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;
Expand All @@ -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,
Expand All @@ -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)
Expand Down
5 changes: 4 additions & 1 deletion test/Makefile.in
Expand Up @@ -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)

Expand Down Expand Up @@ -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)

Expand Down
1 change: 1 addition & 0 deletions test/README
Expand Up @@ -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
Expand Down

0 comments on commit 1566b15

Please sign in to comment.