peerstore: memory leak fixes
authorOmar Tarabai <tarabai@devegypt.com>
Tue, 3 Jun 2014 15:03:36 +0000 (15:03 +0000)
committerOmar Tarabai <tarabai@devegypt.com>
Tue, 3 Jun 2014 15:03:36 +0000 (15:03 +0000)
src/peerstore/gnunet-service-peerstore.c
src/peerstore/peerstore_common.c
src/peerstore/peerstore_common.h
src/peerstore/plugin_peerstore_sqlite.c

index 82961f685c721d4ded5cb38bbc5504cae720bbe3..febebc63a5a989ad983ef077a4fc20a33bcfedf3 100644 (file)
@@ -155,6 +155,7 @@ int record_iterator(void *cls,
       record->expiry,
       GNUNET_MESSAGE_TYPE_PEERSTORE_ITERATE_RECORD);
   GNUNET_SERVER_notification_context_unicast(nc, client, (struct GNUNET_MessageHeader *)srm, GNUNET_NO);
+  GNUNET_free(srm);
   return GNUNET_YES;
 }
 
@@ -190,6 +191,7 @@ int watch_notifier_it(void *cls,
       GNUNET_MESSAGE_TYPE_PEERSTORE_WATCH_RECORD);
   GNUNET_SERVER_notification_context_unicast(nc, client,
       (const struct GNUNET_MessageHeader *)srm, GNUNET_NO);
+  GNUNET_free(srm);
   return GNUNET_YES;
 }
 
@@ -291,12 +293,14 @@ void handle_iterate (void *cls,
     endmsg->size = htons(sizeof(struct GNUNET_MessageHeader));
     endmsg->type = htons(GNUNET_MESSAGE_TYPE_PEERSTORE_ITERATE_END);
     GNUNET_SERVER_notification_context_unicast(nc, client, endmsg, GNUNET_NO);
+    GNUNET_free(endmsg);
+    GNUNET_SERVER_receive_done(client, GNUNET_OK);
   }
   else
   {
     GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
   }
-  GNUNET_free(record); /* FIXME: destroy record */
+  PEERSTORE_destroy_record(record);
 }
 
 /**
@@ -323,8 +327,8 @@ void handle_store (void *cls,
       || NULL == record->peer
       || NULL == record->key)
   {
-    /* FIXME: Destroy record */
     GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Full key not supplied in client store request\n");
+    PEERSTORE_destroy_record(record);
     GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
     return;
   }
@@ -341,13 +345,14 @@ void handle_store (void *cls,
       record->value_size,
       *record->expiry))
   {
-    /* FIXME: Destroy record */
     GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Failed to store requested value, sqlite database error.");
+    PEERSTORE_destroy_record(record);
     GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
     return;
   }
   GNUNET_SERVER_receive_done(client, GNUNET_OK);
   watch_notifier(record);
+  PEERSTORE_destroy_record(record);
 }
 
 /**
index 2b62abf1952a001c398ed95784114803cd1658dd..eeaa3144c6b0961ad8b742a3fbbeea20f2945849 100644 (file)
@@ -233,3 +233,26 @@ PEERSTORE_parse_record_message(const struct GNUNET_MessageHeader *message)
 
   return record;
 }
+
+/**
+ * Free any memory allocated for this record
+ *
+ * @param record
+ */
+void PEERSTORE_destroy_record(struct GNUNET_PEERSTORE_Record *record)
+{
+  if(NULL != record->sub_system)
+    GNUNET_free(record->sub_system);
+  if(NULL != record->peer)
+    GNUNET_free(record->peer);
+  if(NULL != record->key)
+    GNUNET_free(record->key);
+  if(NULL != record->value)
+  {
+    GNUNET_free(record->value);
+    record->value = 0;
+  }
+  if(NULL != record->expiry)
+    GNUNET_free(record->expiry);
+  GNUNET_free(record);
+}
index 20cb9c0e74499d2deeba79d6ca39ab35c8f55c67..dae2b437bfe4cfc28c29a060e2d1e27c24fbec22 100644 (file)
@@ -86,3 +86,10 @@ PEERSTORE_create_record_mq_envelope(const char *sub_system,
  */
 struct GNUNET_PEERSTORE_Record *
 PEERSTORE_parse_record_message(const struct GNUNET_MessageHeader *message);
+
+/**
+ * Free any memory allocated for this record
+ *
+ * @param record
+ */
+void PEERSTORE_destroy_record(struct GNUNET_PEERSTORE_Record *record);
index 8d35466de10240adae1409af7a75d242f425afc3..8705ce1880d2b6343157673256b13e59ef02ba67 100644 (file)
@@ -215,6 +215,8 @@ peerstore_sqlite_iterate_records (void *cls,
       iter (iter_cls,
           ret,
           NULL);
+    GNUNET_free(ret->expiry);
+    GNUNET_free(ret);
   }
   if (SQLITE_DONE != sret)
   {