fixup session memory leak
authorJosé Bollo <jose.bollo@iot.bzh>
Wed, 11 May 2016 15:42:49 +0000 (17:42 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Wed, 11 May 2016 15:42:49 +0000 (17:42 +0200)
Change-Id: I49ed17a3818be6107c46ce17533761858d99f735
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
src/session.c

index 667738c..22e50cf 100644 (file)
@@ -197,10 +197,11 @@ static void ctxStoreCleanUp (time_t now)
 
        // Loop on Sessions Table and remove anything that is older than timeout
        for (idx=0; idx < sessions.max; idx++) {
-               ctx = sessions.store[idx];
+               ctx = ctxClientAddRef(sessions.store[idx]);
                if (ctx != NULL && ctxStoreTooOld(ctx, now)) {
                        ctxClientClose (ctx);
                }
+               ctxClientUnref(ctx);
        }
 }
 
@@ -276,6 +277,7 @@ void ctxClientUnref(struct AFB_clientCtx *clientCtx)
                --clientCtx->refcount;
                        if (clientCtx->refcount == 0 && clientCtx->uuid[0] == 0) {
                        ctxStoreDel (clientCtx);
+                       free(clientCtx);
                }
        }
 }
@@ -284,8 +286,12 @@ void ctxClientUnref(struct AFB_clientCtx *clientCtx)
 void ctxClientClose (struct AFB_clientCtx *clientCtx)
 {
        assert(clientCtx != NULL);
-        ctxUuidFreeCB (clientCtx);
-       clientCtx->uuid[0] = 0;
+       if (clientCtx->uuid[0] != 0) {
+               clientCtx->uuid[0] = 0;
+               ctxUuidFreeCB (clientCtx);
+               while(clientCtx->listeners != NULL)
+                       ctxClientEventListenerRemove(clientCtx, clientCtx->listeners->listener);
+       }
 }
 
 // Sample Generic Ping Debug API