c11 safe string handling support
[vpp.git] / src / plugins / acl / hash_lookup.c
index 82df45e..8c1004e 100644 (file)
@@ -315,7 +315,7 @@ release_mask_type_index(acl_main_t *am, u32 mask_type_index)
   DBG0("RELEAS MTE index %d new refcount %d", mask_type_index, mte->refcount);
   if (mte->refcount == 0) {
     /* we are not using this entry anymore */
-    memset(mte, 0xae, sizeof(*mte));
+    clib_memset(mte, 0xae, sizeof(*mte));
     pool_put(am->ace_mask_type_pool, mte);
   }
 }
@@ -578,7 +578,7 @@ activate_applied_ace_hash_entry(acl_main_t *am,
     ASSERT(last_index != ~0);
     applied_hash_ace_entry_t *last_pae = vec_elt_at_index((*applied_hash_aces), last_index);
     DBG("...advance to chained entry index: %d", last_index);
-    /* link ourseves in */
+    /* link ourselves in */
     last_pae->next_applied_entry_index = new_index;
     pae->prev_applied_entry_index = last_index;
     /* adjust the pointer to the new tail */
@@ -734,12 +734,16 @@ hash_acl_apply(acl_main_t *am, u32 lc_index, int acl_index, u32 acl_position)
    * ACL, so the change adding this code also takes care of that.
    */
 
-  /* expand the applied aces vector by the necessary amount */
-  vec_resize((*applied_hash_aces), vec_len(ha->rules));
 
   vec_validate(am->hash_applied_mask_info_vec_by_lc_index, lc_index);
   /* add the rules from the ACL to the hash table for lookup and append to the vector*/
   for(i=0; i < vec_len(ha->rules); i++) {
+    /*
+     * Expand the applied aces vector to fit a new entry.
+     * One by one not to upset split_partition() if it is called.
+     */
+    vec_resize((*applied_hash_aces), 1);
+
     int is_ip6 = ha->rules[i].match.pkt.is_ip6;
     u32 new_index = base_offset + i;
     applied_hash_ace_entry_t *pae = vec_elt_at_index((*applied_hash_aces), new_index);
@@ -1053,7 +1057,7 @@ ip4_address_mask_from_width (ip4_address_t * a, u32 width)
 {
   int i, byte, bit, bitnum;
   ASSERT (width <= 32);
-  memset (a, 0, sizeof (a[0]));
+  clib_memset (a, 0, sizeof (a[0]));
   for (i = 0; i < width; i++)
     {
       bitnum = (7 - (i & 7));
@@ -1086,8 +1090,8 @@ make_port_mask(u16 *portmask, u16 port_first, u16 port_last)
 static void
 make_mask_and_match_from_rule(fa_5tuple_t *mask, acl_rule_t *r, hash_ace_info_t *hi)
 {
-  memset(mask, 0, sizeof(*mask));
-  memset(&hi->match, 0, sizeof(hi->match));
+  clib_memset(mask, 0, sizeof(*mask));
+  clib_memset(&hi->match, 0, sizeof(hi->match));
   hi->action = r->is_permit;
 
   /* we will need to be matching based on lc_index and mask_type_index when applied */
@@ -1103,7 +1107,7 @@ make_mask_and_match_from_rule(fa_5tuple_t *mask, acl_rule_t *r, hash_ace_info_t
     make_ip6_address_mask(&mask->ip6_addr[1], r->dst_prefixlen);
     hi->match.ip6_addr[1] = r->dst.ip6;
   } else {
-    memset(hi->match.l3_zero_pad, 0, sizeof(hi->match.l3_zero_pad));
+    clib_memset(hi->match.l3_zero_pad, 0, sizeof(hi->match.l3_zero_pad));
     make_ip4_address_mask(&mask->ip4_addr[0], r->src_prefixlen);
     hi->match.ip4_addr[0] = r->src.ip4;
     make_ip4_address_mask(&mask->ip4_addr[1], r->dst_prefixlen);
@@ -1162,7 +1166,7 @@ void hash_acl_add(acl_main_t *am, int acl_index)
   acl_list_t *a = &am->acls[acl_index];
   vec_validate(am->hash_acl_infos, acl_index);
   hash_acl_info_t *ha = vec_elt_at_index(am->hash_acl_infos, acl_index);
-  memset(ha, 0, sizeof(*ha));
+  clib_memset(ha, 0, sizeof(*ha));
   ha->hash_acl_exists = 1;
 
   /* walk the newly added ACL entries and ensure that for each of them there
@@ -1170,7 +1174,7 @@ void hash_acl_add(acl_main_t *am, int acl_index)
   for(i=0; i < a->count; i++) {
     hash_ace_info_t ace_info;
     fa_5tuple_t mask;
-    memset(&ace_info, 0, sizeof(ace_info));
+    clib_memset(&ace_info, 0, sizeof(ace_info));
     ace_info.acl_index = acl_index;
     ace_info.ace_index = i;
 
@@ -1207,7 +1211,7 @@ void hash_acl_delete(acl_main_t *am, int acl_index)
    * should not be possible to delete, and the change adding this also adds
    * the safeguards to that respect, so this is not a problem.
    *
-   * The part to rememeber is that this routine is called in process of reapplication
+   * The part to remember is that this routine is called in process of reapplication
    * during the acl_add_replace() API call - the old acl ruleset is deleted, then
    * the new one is added, without the change in the applied ACLs - so this case
    * has to be handled.
@@ -1477,12 +1481,14 @@ split_partition(acl_main_t *am, u32 first_index,
        hash_acl_info_t *ha = vec_elt_at_index(am->hash_acl_infos, pae->acl_index);
        hash_ace_info_t *ace_info;
        u32 coll_mask_type_index = pae->mask_type_index;
-        memset(&the_min_tuple, 0, sizeof(the_min_tuple));
-        memset(&the_max_tuple, 0, sizeof(the_max_tuple));
+        clib_memset(&the_min_tuple, 0, sizeof(the_min_tuple));
+        clib_memset(&the_max_tuple, 0, sizeof(the_max_tuple));
 
        int i=0;
        u64 collisions = vec_len(pae->colliding_rules);
        for(i=0; i<collisions; i++){
+                /* reload the hash acl info as it might be a different ACL# */
+               ha = vec_elt_at_index(am->hash_acl_infos, pae->acl_index);
 
                DBG( "TM-collision: base_ace:%d (ace_mask:%d, first_collision_mask:%d)",
                                pae->ace_index, pae->mask_type_index, coll_mask_type_index);