From 40afd4dc544c8405b5eabcc4222692d357ddf48e Mon Sep 17 00:00:00 2001
From: Andre Noll <maan@tuebingen.mpg.de>
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