From 7a85d4af059236db9027437fbd58bb41532870c5 Mon Sep 17 00:00:00 2001 From: Kp Date: Sat, 24 Nov 2012 16:26:53 +0000 Subject: [PATCH] Fix memory leak on realloc failure in digi_mixer_music --- d1x-rebirth/arch/sdl/digi_mixer_music.c | 11 ++++++++--- d2x-rebirth/arch/sdl/digi_mixer_music.c | 11 ++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/d1x-rebirth/arch/sdl/digi_mixer_music.c b/d1x-rebirth/arch/sdl/digi_mixer_music.c index 3ac9527c7..6714f71b3 100644 --- a/d1x-rebirth/arch/sdl/digi_mixer_music.c +++ b/d1x-rebirth/arch/sdl/digi_mixer_music.c @@ -87,11 +87,16 @@ int mix_play_file(char *filename, int loop, void (*hook_finished_track)()) filehandle = PHYSFS_openRead(filename); if (filehandle != NULL) { - current_music_hndlbuf = d_realloc(current_music_hndlbuf, sizeof(char *)*PHYSFS_fileLength(filehandle)); - bufsize = PHYSFS_read(filehandle, current_music_hndlbuf, sizeof(char), PHYSFS_fileLength(filehandle)); + unsigned len = PHYSFS_fileLength(filehandle); + unsigned char *p = (unsigned char *)d_realloc(current_music_hndlbuf, sizeof(char)*len); + if (p) + { + current_music_hndlbuf = p; + bufsize = PHYSFS_read(filehandle, current_music_hndlbuf, sizeof(char), len); rw = SDL_RWFromConstMem(current_music_hndlbuf,bufsize*sizeof(char)); - PHYSFS_close(filehandle); current_music = Mix_LoadMUS_RW(rw); + } + PHYSFS_close(filehandle); } } diff --git a/d2x-rebirth/arch/sdl/digi_mixer_music.c b/d2x-rebirth/arch/sdl/digi_mixer_music.c index 3ac9527c7..6714f71b3 100644 --- a/d2x-rebirth/arch/sdl/digi_mixer_music.c +++ b/d2x-rebirth/arch/sdl/digi_mixer_music.c @@ -87,11 +87,16 @@ int mix_play_file(char *filename, int loop, void (*hook_finished_track)()) filehandle = PHYSFS_openRead(filename); if (filehandle != NULL) { - current_music_hndlbuf = d_realloc(current_music_hndlbuf, sizeof(char *)*PHYSFS_fileLength(filehandle)); - bufsize = PHYSFS_read(filehandle, current_music_hndlbuf, sizeof(char), PHYSFS_fileLength(filehandle)); + unsigned len = PHYSFS_fileLength(filehandle); + unsigned char *p = (unsigned char *)d_realloc(current_music_hndlbuf, sizeof(char)*len); + if (p) + { + current_music_hndlbuf = p; + bufsize = PHYSFS_read(filehandle, current_music_hndlbuf, sizeof(char), len); rw = SDL_RWFromConstMem(current_music_hndlbuf,bufsize*sizeof(char)); - PHYSFS_close(filehandle); current_music = Mix_LoadMUS_RW(rw); + } + PHYSFS_close(filehandle); } }