diff --git a/src/cell.c b/src/cell.c
index 7b663b92db59ff651d87ae89e36c39b5b9f18cf2..2796a8933e1fedc2522c833570558adda369140b 100644
--- a/src/cell.c
+++ b/src/cell.c
@@ -711,4 +711,11 @@ void cell_clean_links(struct cell *c, void *data) {
 /**
  * @brief Frees up the memory allocated for this #cell
  */
-void cell_clean(struct cell *c) { free(c->sort); }
+void cell_clean(struct cell *c) {
+
+  free(c->sort);
+
+  /* Recurse */
+  for (int k = 0; k < 8; k++)
+    if (c->progeny[k]) cell_clean(c->progeny[k]);
+}
diff --git a/src/engine.c b/src/engine.c
index 4d32da00f750c15b9f27235d7c2698c1f041abbd..b33850be9415f30f6c0ac38e70a74a7d239b791e 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -3178,8 +3178,8 @@ void engine_init(struct engine *e, struct space *s,
 #if defined(HAVE_SETAFFINITY)
   if (with_aff) {
     free(cpuid);
-    free(buf);
   }
+  free(buf);
 #endif
 
   /* Wait for the runner threads to be in place. */