[sheepdog] [PATCH v8 3/3] lib: correct a way of freeing sockfd_cache_entry

Hitoshi Mitake mitake.hitoshi at lab.ntt.co.jp
Wed Jul 31 09:11:48 CEST 2013


Previous implementation of the sockfd caching mechanism has two memory
leaks. The leak is caused when sockfd_cache_destroy() and
sockfd_cache_add_nolock() try to free a sockfd cache entry. They
forget to free entry->fds.

This patch adds a new function, free_cache_entry() for safe freeing of
sockfd cache entries. And let the above two functions to use it.

Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
---
 lib/sockfd_cache.c |   11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/lib/sockfd_cache.c b/lib/sockfd_cache.c
index 98cea94..9a87ed9 100644
--- a/lib/sockfd_cache.c
+++ b/lib/sockfd_cache.c
@@ -179,6 +179,13 @@ static inline void destroy_all_slots(struct sockfd_cache_entry *entry)
 			close(entry->fds[i].fd);
 }
 
+static void free_cache_entry(struct sockfd_cache_entry *entry)
+{
+	if (entry->fds)
+		free(entry->fds);
+	free(entry);
+}
+
 /*
  * Destroy all the Cached FDs of the node
  *
@@ -206,7 +213,7 @@ static bool sockfd_cache_destroy(const struct node_id *nid)
 	pthread_rwlock_unlock(&sockfd_cache.lock);
 
 	destroy_all_slots(entry);
-	free(entry);
+	free_cache_entry(entry);
 
 	return true;
 false_out:
@@ -225,7 +232,7 @@ static void sockfd_cache_add_nolock(const struct node_id *nid)
 
 	memcpy(&new->nid, nid, sizeof(struct node_id));
 	if (sockfd_cache_insert(new)) {
-		free(new);
+		free_cache_entry(new);
 		return;
 	}
 	sockfd_cache.count++;
-- 
1.7.10.4




More information about the sheepdog mailing list