[PATCH] cachefilesd: avoid memory leak on failure exit

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On failure exit, we may have allocated space for the culltalbes.
Free the space before exit.

Signed-off-by: Wang Sheng-Hui <shhuiw@xxxxxxxxx>
---
 cachefilesd.c |   29 ++++++++++++++++++++++++++---
 1 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/cachefilesd.c b/cachefilesd.c
index f5c04ec..0ac5e5c 100644
--- a/cachefilesd.c
+++ b/cachefilesd.c
@@ -92,8 +92,8 @@ static int jumpstart_scan = 0;
  *   culled objects
  */
 static unsigned culltable_size = 4096;
-static struct object **cullbuild;
-static struct object **cullready;
+static struct object **cullbuild = NULL;
+static struct object **cullready = NULL;

 static int oldest_build = -1;
 static int oldest_ready = -1;
@@ -145,6 +145,26 @@ void help(void)
 	exit(2);
 }

+static void free_culltable(void)
+{
+	if (cullbuild) {
+		while (oldest_build >= 0) {
+			if (((long)cullbuild[oldest_build] & 0xf0000000) != 0x60000000)
+				free(cullbuild[oldest_build]);
+			oldest_build--;
+		}
+		free(cullbuild);
+	}
+	if (cullready) {
+		while (oldest_ready >= 0) {
+			if (((long)cullready[oldest_ready] & 0xf0000000) != 0x60000000)
+				free(cullready[oldest_ready]);
+			oldest_ready--;
+		}
+		free(cullready);
+	}
+}
+
 static __attribute__((noreturn, format(printf, 2, 3)))
 void __error(int excode, const char *fmt, ...)
 {
@@ -168,6 +188,7 @@ void __error(int excode, const char *fmt, ...)
 		closelog();
 	}

+	free_culltable();
 	exit(excode);
 }

@@ -659,6 +680,8 @@ static void cachefilesd(void)
 			reap_graveyard();
 	}

+	free_culltable();
+
 	notice("Daemon Terminated");
 	exit(0);
 }
@@ -1419,7 +1442,7 @@ static void decant_cull_table(void)
 check:
 	for (loop = 0; loop < oldest_ready; loop++)
 		if (((long)cullready[loop] & 0xf0000000) == 0x60000000)
-			abort();
+			error("Bad object in cullready table (%d:%d)", oldest_ready, loop);
 }

 /*****************************************************************************/
--
1.6.0.2

--
Linux-cachefs mailing list
Linux-cachefs@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/linux-cachefs


[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]
  Powered by Linux