Merge pull request #1018 from lioncash/free

Sanitize against NULL in some free-like functions.
This commit is contained in:
Twinaphex 2014-09-15 16:08:18 +02:00
commit 60bd5e8323
29 changed files with 127 additions and 4 deletions

View File

@ -182,6 +182,9 @@ bool libretro_get_system_info(const char *path,
void libretro_free_system_info(struct retro_system_info *info) void libretro_free_system_info(struct retro_system_info *info)
{ {
if (!info)
return;
free((void*)info->library_name); free((void*)info->library_name);
free((void*)info->library_version); free((void*)info->library_version);
free((void*)info->valid_extensions); free((void*)info->valid_extensions);

View File

@ -43,6 +43,9 @@ fifo_buffer_t *fifo_new(size_t size)
void fifo_free(fifo_buffer_t *buffer) void fifo_free(fifo_buffer_t *buffer)
{ {
if(!buffer)
return;
free(buffer->buffer); free(buffer->buffer);
free(buffer); free(buffer);
} }

View File

@ -84,6 +84,9 @@ void file_list_free(file_list_t *list)
{ {
size_t i; size_t i;
if (!list)
return;
for (i = 0; i < list->size; i++) for (i = 0; i < list->size; i++)
{ {
free(list->list[i].path); free(list->list[i].path);

View File

@ -717,6 +717,10 @@ static void *d3d_init(const video_info_t *info,
static void d3d_free(void *data) static void d3d_free(void *data)
{ {
d3d_video_t *d3d = (d3d_video_t*)data; d3d_video_t *d3d = (d3d_video_t*)data;
if (!d3d)
return;
d3d_deinitialize(d3d); d3d_deinitialize(d3d);
#ifdef HAVE_OVERLAY #ifdef HAVE_OVERLAY
d3d_free_overlays(d3d); d3d_free_overlays(d3d);
@ -1342,6 +1346,9 @@ static void d3d_free_overlay(void *data, overlay_t *overlay)
{ {
d3d_video_t *d3d = (d3d_video_t*)data; d3d_video_t *d3d = (d3d_video_t*)data;
if (!d3d)
return;
d3d_texture_free(overlay->tex); d3d_texture_free(overlay->tex);
d3d_vertex_buffer_free(overlay->vert_buf); d3d_vertex_buffer_free(overlay->vert_buf);
} }
@ -1351,6 +1358,9 @@ static void d3d_free_overlays(void *data)
unsigned i; unsigned i;
d3d_video_t *d3d = (d3d_video_t*)data; d3d_video_t *d3d = (d3d_video_t*)data;
if (!d3d)
return;
for (i = 0; i < d3d->overlays.size(); i++) for (i = 0; i < d3d->overlays.size(); i++)
d3d_free_overlay(d3d, &d3d->overlays[i]); d3d_free_overlay(d3d, &d3d->overlays[i]);
d3d->overlays.clear(); d3d->overlays.clear();

View File

@ -36,6 +36,9 @@ void renderchain_free(void *data)
{ {
renderchain_t *chain = (renderchain_t*)data; renderchain_t *chain = (renderchain_t*)data;
if (!chain)
return;
renderchain_clear(chain); renderchain_clear(chain);
renderchain_destroy_stock_shader(chain); renderchain_destroy_stock_shader(chain);
if (chain->tracker) if (chain->tracker)

View File

@ -145,6 +145,10 @@ void renderchain_set_shaders(void *data, CGprogram &fPrg, CGprogram &vPrg)
void renderchain_destroy_stock_shader(void *data) void renderchain_destroy_stock_shader(void *data)
{ {
renderchain_t *chain = (renderchain_t*)data; renderchain_t *chain = (renderchain_t*)data;
if (!chain)
return;
#ifdef HAVE_CG #ifdef HAVE_CG
if (chain->fStock) if (chain->fStock)
cgDestroyProgram(chain->fStock); cgDestroyProgram(chain->fStock);
@ -156,6 +160,10 @@ void renderchain_destroy_stock_shader(void *data)
void renderchain_destroy_shader(void *data, int i) void renderchain_destroy_shader(void *data, int i)
{ {
renderchain_t *chain = (renderchain_t*)data; renderchain_t *chain = (renderchain_t*)data;
if (!chain)
return;
#ifdef HAVE_CG #ifdef HAVE_CG
if (chain->passes[i].fPrg) if (chain->passes[i].fPrg)
cgDestroyProgram(chain->passes[i].fPrg); cgDestroyProgram(chain->passes[i].fPrg);

View File

@ -23,6 +23,9 @@ static void renderchain_free(void *data)
{ {
d3d_video_t *chain = (d3d_video_t*)data; d3d_video_t *chain = (d3d_video_t*)data;
if (!chain)
return;
renderchain_clear(chain); renderchain_clear(chain);
//renderchain_destroy_stock_shader(chain); //renderchain_destroy_stock_shader(chain);
#ifndef DONT_HAVE_STATE_TRACKER #ifndef DONT_HAVE_STATE_TRACKER

View File

@ -257,6 +257,10 @@ static void twoxbr_generic_output(void *data,
static void twoxbr_generic_destroy(void *data) static void twoxbr_generic_destroy(void *data)
{ {
struct filter_data *filt = (struct filter_data*)data; struct filter_data *filt = (struct filter_data*)data;
if (!filt)
return;
free(filt->workers); free(filt->workers);
free(filt); free(filt);
} }

View File

@ -97,6 +97,10 @@ static void twoxsai_generic_output(void *data,
static void twoxsai_generic_destroy(void *data) static void twoxsai_generic_destroy(void *data)
{ {
struct filter_data *filt = (struct filter_data*)data; struct filter_data *filt = (struct filter_data*)data;
if (!filt)
return;
free(filt->workers); free(filt->workers);
free(filt); free(filt);
} }

View File

@ -154,6 +154,9 @@ static void blargg_ntsc_snes_generic_destroy(void *data)
{ {
struct filter_data *filt = (struct filter_data*)data; struct filter_data *filt = (struct filter_data*)data;
if (!filt)
return;
if(filt->ntsc) if(filt->ntsc)
free(filt->ntsc); free(filt->ntsc);

View File

@ -95,6 +95,10 @@ static void darken_output(void *data, unsigned *out_width, unsigned *out_height,
static void darken_destroy(void *data) static void darken_destroy(void *data)
{ {
struct filter_data *filt = (struct filter_data*)data; struct filter_data *filt = (struct filter_data*)data;
if (!filt)
return;
free(filt->workers); free(filt->workers);
free(filt); free(filt);
} }

View File

@ -96,6 +96,10 @@ static void epx_generic_output(void *data,
static void epx_generic_destroy(void *data) static void epx_generic_destroy(void *data)
{ {
struct filter_data *filt = (struct filter_data*)data; struct filter_data *filt = (struct filter_data*)data;
if (!filt)
return;
free(filt->workers); free(filt->workers);
free(filt); free(filt);
} }

View File

@ -96,6 +96,10 @@ static void lq2x_generic_output(void *data,
static void lq2x_generic_destroy(void *data) static void lq2x_generic_destroy(void *data)
{ {
struct filter_data *filt = (struct filter_data*)data; struct filter_data *filt = (struct filter_data*)data;
if (!filt)
return;
free(filt->workers); free(filt->workers);
free(filt); free(filt);
} }

View File

@ -302,6 +302,10 @@ static void phosphor2x_generic_output(void *data,
static void phosphor2x_generic_destroy(void *data) static void phosphor2x_generic_destroy(void *data)
{ {
struct filter_data *filt = (struct filter_data*)data; struct filter_data *filt = (struct filter_data*)data;
if (!filt)
return;
free(filt->workers); free(filt->workers);
free(filt); free(filt);
} }

View File

@ -159,6 +159,10 @@ static void scale2x_generic_output(void *data,
static void scale2x_generic_destroy(void *data) static void scale2x_generic_destroy(void *data)
{ {
struct filter_data *filt = (struct filter_data*)data; struct filter_data *filt = (struct filter_data*)data;
if (!filt)
return;
free(filt->workers); free(filt->workers);
free(filt); free(filt);
} }

View File

@ -96,6 +96,10 @@ static void supertwoxsai_generic_output(void *data, unsigned *out_width, unsigne
static void supertwoxsai_generic_destroy(void *data) static void supertwoxsai_generic_destroy(void *data)
{ {
struct filter_data *filt = (struct filter_data*)data; struct filter_data *filt = (struct filter_data*)data;
if (!filt)
return;
free(filt->workers); free(filt->workers);
free(filt); free(filt);
} }

View File

@ -96,6 +96,10 @@ static void supereagle_generic_output(void *data, unsigned *out_width, unsigned
static void supereagle_generic_destroy(void *data) static void supereagle_generic_destroy(void *data)
{ {
struct filter_data *filt = (struct filter_data*)data; struct filter_data *filt = (struct filter_data*)data;
if (!filt)
return;
free(filt->workers); free(filt->workers);
free(filt); free(filt);
} }

View File

@ -212,6 +212,9 @@ static bool rpng_gx_convert_texture32(struct texture_image *image)
void texture_image_free(struct texture_image *img) void texture_image_free(struct texture_image *img)
{ {
if (!img)
return;
free(img->pixels); free(img->pixels);
memset(img, 0, sizeof(*img)); memset(img, 0, sizeof(*img));
} }

View File

@ -145,6 +145,9 @@ static bool png_read_chunk(FILE *file, struct png_chunk *chunk)
static void png_free_chunk(struct png_chunk *chunk) static void png_free_chunk(struct png_chunk *chunk)
{ {
if (!chunk)
return;
free(chunk->data); free(chunk->data);
chunk->data = NULL; chunk->data = NULL;
} }

View File

@ -182,6 +182,9 @@ static void vg_free(void *data)
{ {
vg_t *vg = (vg_t*)data; vg_t *vg = (vg_t*)data;
if (!vg)
return;
vgDestroyImage(vg->mImage); vgDestroyImage(vg->mImage);
if (vg->mFontsOn) if (vg->mFontsOn)

View File

@ -780,6 +780,10 @@ static bool xv_focus(void *data)
static void xv_free(void *data) static void xv_free(void *data)
{ {
xv_t *xv = (xv_t*)data; xv_t *xv = (xv_t*)data;
if (!xv)
return;
x11_destroy_input_context(&xv->xim, &xv->xic); x11_destroy_input_context(&xv->xim, &xv->xic);
XShmDetach(xv->display, &xv->shminfo); XShmDetach(xv->display, &xv->shminfo);
shmdt(xv->shminfo.shmaddr); shmdt(xv->shminfo.shmaddr);

View File

@ -176,10 +176,13 @@ static void gx_input_free_input(void *data)
{ {
gx_input_t *gx = (gx_input_t*)data; gx_input_t *gx = (gx_input_t*)data;
if (!gx)
return;
if (gx->joypad) if (gx->joypad)
gx->joypad->destroy(); gx->joypad->destroy();
free(data); free(gx);
} }
static const char *gx_joypad_name(unsigned pad) static const char *gx_joypad_name(unsigned pad)

View File

@ -166,6 +166,9 @@ static void input_overlay_free_overlay(struct overlay *overlay)
{ {
size_t i; size_t i;
if (!overlay)
return;
for (i = 0; i < overlay->size; i++) for (i = 0; i < overlay->size; i++)
texture_image_free(&overlay->descs[i].image); texture_image_free(&overlay->descs[i].image);
@ -177,8 +180,13 @@ static void input_overlay_free_overlay(struct overlay *overlay)
static void input_overlay_free_overlays(input_overlay_t *ol) static void input_overlay_free_overlays(input_overlay_t *ol)
{ {
size_t i; size_t i;
if (!ol)
return;
for (i = 0; i < ol->size; i++) for (i = 0; i < ol->size; i++)
input_overlay_free_overlay(&ol->overlays[i]); input_overlay_free_overlay(&ol->overlays[i]);
free(ol->overlays); free(ol->overlays);
} }

View File

@ -127,6 +127,9 @@ static void psp_input_free_input(void *data)
{ {
psp_input_t *psp = (psp_input_t*)data; psp_input_t *psp = (psp_input_t*)data;
if (!psp)
return;
if (psp->joypad) if (psp->joypad)
psp->joypad->destroy(); psp->joypad->destroy();

View File

@ -132,9 +132,12 @@ static void rwebinput_input_free(void *data)
rwebinput_input_t *rwebinput = (rwebinput_input_t*)data; rwebinput_input_t *rwebinput = (rwebinput_input_t*)data;
uninited = true; uninited = true;
if (!rwebinput)
return;
RWebInputDestroy(rwebinput->context); RWebInputDestroy(rwebinput->context);
free(data); free(rwebinput);
} }
static void rwebinput_input_poll(void *data) static void rwebinput_input_poll(void *data)

View File

@ -230,10 +230,13 @@ static void x_input_free(void *data)
{ {
x11_input_t *x11 = (x11_input_t*)data; x11_input_t *x11 = (x11_input_t*)data;
if (!x11)
return;
if (x11->joypad) if (x11->joypad)
x11->joypad->destroy(); x11->joypad->destroy();
free(data); free(x11);
} }
static void x_input_poll_mouse(x11_input_t *x11) static void x_input_poll_mouse(x11_input_t *x11)

View File

@ -183,10 +183,13 @@ static void xdk_input_free_input(void *data)
{ {
xdk_input_t *xdk = (xdk_input_t*)data; xdk_input_t *xdk = (xdk_input_t*)data;
if (!xdk)
return;
if (xdk->joypad) if (xdk->joypad)
xdk->joypad->destroy(); xdk->joypad->destroy();
free(data); free(xdk);
} }
static void *xdk_input_init(void) static void *xdk_input_init(void)

View File

@ -170,6 +170,9 @@ error:
void state_manager_free(state_manager_t *state) void state_manager_free(state_manager_t *state)
{ {
if (!state)
return;
free(state->data); free(state->data);
free(state->thisblock); free(state->thisblock);
free(state->nextblock); free(state->nextblock);

View File

@ -122,6 +122,9 @@ slock_t *slock_new(void)
void slock_free(slock_t *lock) void slock_free(slock_t *lock)
{ {
if (!lock)
return;
CloseHandle(lock->lock); CloseHandle(lock->lock);
free(lock); free(lock);
} }
@ -201,6 +204,9 @@ int scond_broadcast(scond_t *cond)
void scond_free(scond_t *cond) void scond_free(scond_t *cond)
{ {
if (!cond)
return;
CloseHandle(cond->event); CloseHandle(cond->event);
free(cond); free(cond);
} }
@ -279,6 +285,9 @@ slock_t *slock_new(void)
void slock_free(slock_t *lock) void slock_free(slock_t *lock)
{ {
if (!lock)
return;
pthread_mutex_destroy(&lock->lock); pthread_mutex_destroy(&lock->lock);
free(lock); free(lock);
} }
@ -315,6 +324,9 @@ scond_t *scond_new(void)
void scond_free(scond_t *cond) void scond_free(scond_t *cond)
{ {
if (!cond)
return;
pthread_cond_destroy(&cond->cond); pthread_cond_destroy(&cond->cond);
free(cond); free(cond);
} }