]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_aspath.c
bgpd, lib: memory cleanups for valgrind, plus debug changes
[mirror_frr.git] / bgpd / bgp_aspath.c
index eca4441010df558f684056ce6b66e60b145da3f8..70d4f04935e258393f51bc1b1c4357699c687049 100644 (file)
@@ -100,6 +100,12 @@ assegment_data_new (int num)
   return (XMALLOC (MTYPE_AS_SEG_DATA, ASSEGMENT_DATA_SIZE (num, 1)));
 }
 
+static void
+assegment_data_free (as_t *asdata)
+{
+  XFREE (MTYPE_AS_SEG_DATA, asdata);
+}
+
 const char *aspath_segment_type_str[] = {
   "as-invalid",
   "as-set",
@@ -136,7 +142,7 @@ assegment_free (struct assegment *seg)
     return;
   
   if (seg->as)
-    XFREE (MTYPE_AS_SEG_DATA, seg->as);
+    assegment_data_free (seg->as);
   memset (seg, 0xfe, sizeof(struct assegment));
   XFREE (MTYPE_AS_SEG, seg);
   
@@ -204,13 +210,14 @@ assegment_prepend_asns (struct assegment *seg, as_t asnum, int num)
   if (num >= AS_SEGMENT_MAX)
     return seg; /* we don't do huge prepends */
   
-  newas = assegment_data_new (seg->length + num);
+  if ((newas = assegment_data_new (seg->length + num)) == NULL)
+    return seg;
 
   for (i = 0; i < num; i++)
     newas[i] = asnum;
 
   memcpy (newas + num, seg->as, ASSEGMENT_DATA_SIZE (seg->length, 1));
-  XFREE (MTYPE_AS_SEG_DATA, seg->as);
+  assegment_data_free (seg->as);
   seg->as = newas;
   seg->length += num;
 
@@ -2111,6 +2118,7 @@ aspath_init (void)
 void
 aspath_finish (void)
 {
+  hash_clean (ashash, (void (*)(void *))aspath_free);
   hash_free (ashash);
   ashash = NULL;