vhost: fix dereferencing invalid pointer after realloc
[dpdk.git] / lib / librte_member / rte_member.c
index cc03f7c..b9def9a 100644 (file)
@@ -41,6 +41,8 @@
 #include <rte_errno.h>
 
 #include "rte_member.h"
+#include "rte_member_ht.h"
+#include "rte_member_vbf.h"
 
 int librte_member_logtype;
 
@@ -96,6 +98,12 @@ rte_member_free(struct rte_member_setsum *setsum)
        rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
 
        switch (setsum->type) {
+       case RTE_MEMBER_TYPE_HT:
+               rte_member_free_ht(setsum);
+               break;
+       case RTE_MEMBER_TYPE_VBF:
+               rte_member_free_vbf(setsum);
+               break;
        default:
                break;
        }
@@ -163,6 +171,12 @@ rte_member_create(const struct rte_member_parameters *params)
        setsum->sec_hash_seed = params->sec_hash_seed;
 
        switch (setsum->type) {
+       case RTE_MEMBER_TYPE_HT:
+               ret = rte_member_create_ht(setsum, params);
+               break;
+       case RTE_MEMBER_TYPE_VBF:
+               ret = rte_member_create_vbf(setsum, params);
+               break;
        default:
                goto error_unlock_exit;
        }
@@ -190,8 +204,11 @@ rte_member_add(const struct rte_member_setsum *setsum, const void *key,
        if (setsum == NULL || key == NULL)
                return -EINVAL;
 
-       (void) set_id;
        switch (setsum->type) {
+       case RTE_MEMBER_TYPE_HT:
+               return rte_member_add_ht(setsum, key, set_id);
+       case RTE_MEMBER_TYPE_VBF:
+               return rte_member_add_vbf(setsum, key, set_id);
        default:
                return -EINVAL;
        }
@@ -205,6 +222,10 @@ rte_member_lookup(const struct rte_member_setsum *setsum, const void *key,
                return -EINVAL;
 
        switch (setsum->type) {
+       case RTE_MEMBER_TYPE_HT:
+               return rte_member_lookup_ht(setsum, key, set_id);
+       case RTE_MEMBER_TYPE_VBF:
+               return rte_member_lookup_vbf(setsum, key, set_id);
        default:
                return -EINVAL;
        }
@@ -218,8 +239,13 @@ rte_member_lookup_bulk(const struct rte_member_setsum *setsum,
        if (setsum == NULL || keys == NULL || set_ids == NULL)
                return -EINVAL;
 
-       (void) num_keys;
        switch (setsum->type) {
+       case RTE_MEMBER_TYPE_HT:
+               return rte_member_lookup_bulk_ht(setsum, keys, num_keys,
+                               set_ids);
+       case RTE_MEMBER_TYPE_VBF:
+               return rte_member_lookup_bulk_vbf(setsum, keys, num_keys,
+                               set_ids);
        default:
                return -EINVAL;
        }
@@ -232,8 +258,13 @@ rte_member_lookup_multi(const struct rte_member_setsum *setsum, const void *key,
        if (setsum == NULL || key == NULL || set_id == NULL)
                return -EINVAL;
 
-       (void) match_per_key;
        switch (setsum->type) {
+       case RTE_MEMBER_TYPE_HT:
+               return rte_member_lookup_multi_ht(setsum, key, match_per_key,
+                               set_id);
+       case RTE_MEMBER_TYPE_VBF:
+               return rte_member_lookup_multi_vbf(setsum, key, match_per_key,
+                               set_id);
        default:
                return -EINVAL;
        }
@@ -249,9 +280,13 @@ rte_member_lookup_multi_bulk(const struct rte_member_setsum *setsum,
                        match_count == NULL)
                return -EINVAL;
 
-       (void) num_keys;
-       (void) max_match_per_key;
        switch (setsum->type) {
+       case RTE_MEMBER_TYPE_HT:
+               return rte_member_lookup_multi_bulk_ht(setsum, keys, num_keys,
+                               max_match_per_key, match_count, set_ids);
+       case RTE_MEMBER_TYPE_VBF:
+               return rte_member_lookup_multi_bulk_vbf(setsum, keys, num_keys,
+                               max_match_per_key, match_count, set_ids);
        default:
                return -EINVAL;
        }
@@ -264,8 +299,11 @@ rte_member_delete(const struct rte_member_setsum *setsum, const void *key,
        if (setsum == NULL || key == NULL)
                return -EINVAL;
 
-       (void) set_id;
        switch (setsum->type) {
+       case RTE_MEMBER_TYPE_HT:
+               return rte_member_delete_ht(setsum, key, set_id);
+       /* current vBF implementation does not support delete function */
+       case RTE_MEMBER_TYPE_VBF:
        default:
                return -EINVAL;
        }
@@ -277,6 +315,12 @@ rte_member_reset(const struct rte_member_setsum *setsum)
        if (setsum == NULL)
                return;
        switch (setsum->type) {
+       case RTE_MEMBER_TYPE_HT:
+               rte_member_reset_ht(setsum);
+               return;
+       case RTE_MEMBER_TYPE_VBF:
+               rte_member_reset_vbf(setsum);
+               return;
        default:
                return;
        }