Fix coverity issue
[vpp.git] / src / vnet / lisp-cp / control.c
index 6408b29..439802c 100644 (file)
@@ -44,13 +44,6 @@ typedef struct
   u8 smr_invoked;
 } map_request_args_t;
 
-typedef struct
-{
-  u64 nonce;
-  u8 is_rloc_probe;
-  mapping_t *mappings;
-} map_records_arg_t;
-
 u8
 vnet_lisp_get_map_request_mode (void)
 {
@@ -2461,7 +2454,7 @@ send_map_register (lisp_cp_main_t * lcm, u8 want_map_notif)
   u64 nonce = 0;
   u32 next_index, *to_next;
   ip_address_t *ms = 0;
-  mapping_t *records, *r, *g;
+  mapping_t *records, *r, *group, *k;
 
   // TODO: support multiple map servers and do election
   if (0 == vec_len (lcm->map_servers))
@@ -2488,12 +2481,25 @@ send_map_register (lisp_cp_main_t * lcm, u8 want_map_notif)
     if (!key)
       continue;                        /* no secret key -> map-register cannot be sent */
 
-    g = 0;
-    // TODO: group mappings that share common key
-    vec_add1 (g, r[0]);
-    b = build_map_register (lcm, &sloc, ms, &nonce, want_map_notif, g,
+    group = 0;
+    vec_add1 (group, r[0]);
+
+    /* group mappings that share common key */
+    for (k = r + 1; k < vec_end (records); k++)
+      {
+       if (k->key_id != r->key_id)
+         continue;
+
+       if (vec_is_equal (k->key, r->key))
+         {
+           vec_add1 (group, k[0]);
+           k->key = 0;         /* don't process this mapping again */
+         }
+      }
+
+    b = build_map_register (lcm, &sloc, ms, &nonce, want_map_notif, group,
                            key_id, key, &bi);
-    vec_free (g);
+    vec_free (group);
     if (!b)
       continue;
 
@@ -3239,6 +3245,8 @@ parse_map_records (vlib_buffer_t * b, map_records_arg_t * a, u8 count)
   mapping_t m;
   locator_t *loc;
 
+  memset (&m, 0, sizeof (m));
+
   /* parse record eid */
   for (i = 0; i < count; i++)
     {
@@ -3485,7 +3493,7 @@ done:
   vec_free (itr_rlocs);
 }
 
-static map_records_arg_t *
+map_records_arg_t *
 parse_map_reply (vlib_buffer_t * b)
 {
   locator_t probed;
@@ -3501,6 +3509,11 @@ parse_map_reply (vlib_buffer_t * b)
   mrep_hdr = vlib_buffer_get_current (b);
   a->nonce = MREP_NONCE (mrep_hdr);
   a->is_rloc_probe = MREP_RLOC_PROBE (mrep_hdr);
+  if (!vlib_buffer_has_space (b, sizeof (*mrep_hdr)))
+    {
+      clib_mem_free (a);
+      return 0;
+    }
   vlib_buffer_pull (b, sizeof (*mrep_hdr));
 
   for (i = 0; i < MREP_REC_COUNT (mrep_hdr); i++)