From 40afd4dc544c8405b5eabcc4222692d357ddf48e Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 4 Jan 2015 02:45:38 +0000 Subject: [PATCH] sync filter: Fix memory leak. We leaked a struct sync_buddy for every audio file. Freeing the structure in sync_close_buddy() should close this leak. --- sync_filter.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/sync_filter.c b/sync_filter.c index 8c3570fd..6a2a0946 100644 --- a/sync_filter.c +++ b/sync_filter.c @@ -61,18 +61,17 @@ struct sync_filter_config { static void sync_close_buddy(struct sync_buddy *buddy) { - if (buddy->fd < 0) - return; - PARA_DEBUG_LOG("closing %s\n", buddy->sbi->url); + PARA_DEBUG_LOG("closing %s, fd %d\n", buddy->sbi->url, buddy->fd); close(buddy->fd); - buddy->fd = -1; + list_del(&buddy->node); + free(buddy); } static void sync_close_buddies(struct sync_filter_context *ctx) { - struct sync_buddy *buddy; + struct sync_buddy *buddy, *tmp; - FOR_EACH_BUDDY(buddy, &ctx->buddies) + FOR_EACH_BUDDY_SAFE(buddy, tmp, &ctx->buddies) sync_close_buddy(buddy); } @@ -244,6 +243,8 @@ static void sync_disable_active_buddies(struct sync_filter_context *ctx) FOR_EACH_BUDDY(buddy, &ctx->buddies) { if (buddy->sbi->disabled) continue; + if (buddy->ping_received == true) + continue; PARA_NOTICE_LOG("disabling %s\n", buddy->sbi->url); buddy->sbi->disabled = true; } @@ -328,11 +329,10 @@ static int sync_post_select(__a_unused struct sched *s, void *context) buddy->sbi->url, buddy->sbi->disabled? "disabled" : "enabled"); ret = xwrite(buddy->fd, &c, 1); - sync_close_buddy(buddy); if (ret < 0) { PARA_WARNING_LOG("failed to write to %s: %s\n", buddy->sbi->url, para_strerror(-ret)); - list_del(&buddy->node); + sync_close_buddy(buddy); } } ctx->ping_sent = true; @@ -361,7 +361,7 @@ static int sync_post_select(__a_unused struct sched *s, void *context) buddy->sbi->url); buddy->sbi->disabled = false; } - list_del(&buddy->node); + buddy->ping_received = true; } } if (!sync_complete(ctx)) -- 2.39.5