Skip to content

Commit

Permalink
Masks: do not leak anything gui->points-related
Browse files Browse the repository at this point in the history
Fixes a LOT of leaks like:
Indirect leak of 1368 byte(s) in 1 object(s) allocated from:
    #0 0x7f168ee014e1 in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x944e1)
    #1 0x7f168ea5850a in dt_circle_get_points /home/lebedevri/darktable/src/develop/masks/circle.c:551
    #2 0x7f168ea895fb in dt_masks_get_points_border /home/lebedevri/darktable/src/develop/masks/masks.c:343
    #3 0x7f168ea8aacc in dt_masks_gui_form_create /home/lebedevri/darktable/src/develop/masks/masks.c:94
    #4 0x7f168ea8e161 in dt_masks_gui_form_test_create /home/lebedevri/darktable/src/develop/masks/masks.c:144
    #5 0x7f168eaa0d5a in dt_masks_events_post_expose /home/lebedevri/darktable/src/develop/masks/masks.c:1281
    #6 0x7f16697bcafc  (<unknown module>)
    #7 0x7f168eb24a33 in dt_view_manager_expose /home/lebedevri/darktable/src/views/view.c:473
    #8 0x7f168e9d1626 in dt_control_expose /home/lebedevri/darktable/src/control/control.c:293
    #9 0x7f168eae1676 in draw /home/lebedevri/darktable/src/gui/gtk.c:451
    #10 0x7f168e12da8c  (/usr/lib/x86_64-linux-gnu/libgtk-3.so.0+0x208a8c)

(cherry picked from commit 2341485)
  • Loading branch information
LebedevRI authored and pmjdebruijn committed Oct 1, 2015
1 parent 5712c6b commit 4213f3c
Showing 1 changed file with 19 additions and 6 deletions.
25 changes: 19 additions & 6 deletions src/develop/masks/masks.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,15 +82,15 @@ void dt_masks_gui_form_create(dt_masks_form_t *form, dt_masks_form_gui_t *gui, i
if(g_list_length(gui->points) == index)
{
dt_masks_form_gui_points_t *gpt2
= (dt_masks_form_gui_points_t *)malloc(sizeof(dt_masks_form_gui_points_t));
= (dt_masks_form_gui_points_t *)calloc(1, sizeof(dt_masks_form_gui_points_t));
gui->points = g_list_append(gui->points, gpt2);
}
else if(g_list_length(gui->points) < index)
return;
dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index);
gui->pipe_hash = gui->formid = gpt->points_count = gpt->border_count = gpt->source_count = 0;
gpt->points = gpt->border = gpt->source = NULL;

dt_masks_gui_form_remove(form, gui, index);

dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index);
if(dt_masks_get_points_border(darktable.develop, form, &gpt->points, &gpt->points_count, &gpt->border,
&gpt->border_count, 0))
{
Expand All @@ -100,6 +100,19 @@ void dt_masks_gui_form_create(dt_masks_form_t *form, dt_masks_form_gui_t *gui, i
gui->formid = form->formid;
}
}

void dt_masks_form_gui_points_free(gpointer data)
{
if(!data) return;

dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)data;

free(gpt->points);
free(gpt->border);
free(gpt->source);
free(gpt);
}

void dt_masks_gui_form_remove(dt_masks_form_t *form, dt_masks_form_gui_t *gui, int index)
{
dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index);
Expand All @@ -125,7 +138,7 @@ void dt_masks_gui_form_test_create(dt_masks_form_t *form, dt_masks_form_gui_t *g
if(gui->pipe_hash != darktable.develop->preview_pipe->backbuf_hash)
{
gui->pipe_hash = gui->formid = 0;
g_list_free(gui->points);
g_list_free_full(gui->points, dt_masks_form_gui_points_free);
gui->points = NULL;
}
}
Expand Down Expand Up @@ -1166,7 +1179,7 @@ void dt_masks_events_post_expose(struct dt_iop_module_t *module, cairo_t *cr, in

void dt_masks_clear_form_gui(dt_develop_t *dev)
{
g_list_free(dev->form_gui->points);
g_list_free_full(dev->form_gui->points, dt_masks_form_gui_points_free);
dev->form_gui->points = NULL;
dt_masks_dynbuf_free(dev->form_gui->guipoints);
dev->form_gui->guipoints = NULL;
Expand Down

0 comments on commit 4213f3c

Please sign in to comment.