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

[tyndur-devel] [PATCH] cdi/cache: Fix fuer PF und Memleak



! cdi/cache: Wenn das einlesen eines Blockes fehlgeschlagen ist, und ein
             Block deshalb freigegeben werden muss, reich es nicht, ihn
             nur aus dem Baum zu entfernen, er muss auch aus der
             LRU-Liste entfernt werden, sonnst knallts beim naechsten
             Sync.
! cdi/cache: Im oben erwaehnten Fall wurden bis jetzt die privaten Daten
             fuer den Block nicht freigegeben.

Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
---
 src/modules/cdi/lib/cache.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/src/modules/cdi/lib/cache.c b/src/modules/cdi/lib/cache.c
index fc2fa49..b8c41ba 100644
--- a/src/modules/cdi/lib/cache.c
+++ b/src/modules/cdi/lib/cache.c
@@ -428,10 +428,19 @@ struct cdi_cache_block* cdi_cache_block_get(struct cdi_cache* cache,
             // werden
             if (in_tree) {
                 tree_remove(c->tree, b);
+
+                // Auch aus der LRU-Liste muss der Block ggf. entfernt werden
+                if (b->lru_next) {
+                    b->lru_next->lru_prev = b->lru_prev;
+                }
+                if (b->lru_prev) {
+                    b->lru_prev->lru_next = b->lru_next;
+                }
             }
             c->blocks_used--;
 
             free(b->cdi.data);
+            free(b->cdi.private);
             free(b);
             return NULL;
         }
-- 
1.6.0.6