all repos — openbox @ bbf0eed8d146602e81e64e9bc6d1c451c260b52f

openbox fork - make it a bit more like ryudo

don't reference free'd memory, and don't leak memory if the image cache is not saving any resized pictures
Dana Jansens danakj@orodu.net
commit

bbf0eed8d146602e81e64e9bc6d1c451c260b52f

parent

87124ae865e51cd241af573284453e928f7d630a

1 files changed, 16 insertions(+), 3 deletions(-)

jump to
M render/image.crender/image.c

@@ -40,6 +40,14 @@ for (i = w*h; i > 0; --i)

pic->sum += *(data++); } +static void RrImagePicFree(RrImagePic *pic) +{ + if (pic) { + g_free(pic->data); + g_free(pic); + } +} + /*! Add a picture to an Image, that is, add another copy of the image at another size. This may add it to the "originals" list or to the "resized" list. */

@@ -91,9 +99,8 @@

/* remove the picture as a key in the cache */ g_hash_table_remove(self->cache->table, (*list)[i]); - /* free the picture (and its rgba data) */ - g_free((*list)[i]); - g_free((*list)[i]->data); + /* free the picture */ + RrImagePicFree((*list)[i]); /* shift everything down one */ for (j = i; j < *len-1; ++j) (*list)[j] = (*list)[j+1];

@@ -385,9 +392,11 @@ {

gint i, min_diff, min_i, min_aspect_diff, min_aspect_i; RrImage *self; RrImagePic *pic; + gboolean free_pic; self = img->image; pic = NULL; + free_pic = FALSE; /* is there an original of this size? (only w or h has to be right cuz we maintain aspect ratios) */

@@ -474,6 +483,8 @@ &self->n_resized);

if (self->cache->max_resized_saved) /* add it to the top of the resized list */ AddPicture(self, &self->resized, &self->n_resized, pic); + else + free_pic = TRUE; /* don't leak mem! */ } g_assert(pic != NULL);

@@ -481,4 +492,6 @@

DrawRGBA(target, target_w, target_h, pic->data, pic->width, pic->height, img->alpha, area); + if (free_pic) + RrImagePicFree(pic); }