[3/3] helper: tables: avoid invalid odp_shm_addr() calls

Message ID 20170203002802.28881-3-bill.fischofer@linaro.org
State New
Headers show
Series
  • [1/3] helper: cuckootable: avoid storage leaks on error paths
Related show

Commit Message

Bill Fischofer Feb. 3, 2017, 12:28 a.m.
In the various table lookup routines, check that odp_shm_lookup() returns
a valid handle before attempting to dereference it via odp_shm_addr().

Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org>

---
 helper/cuckootable.c   | 7 +++++--
 helper/hashtable.c     | 7 +++++--
 helper/iplookuptable.c | 5 ++++-
 helper/lineartable.c   | 7 +++++--
 4 files changed, 19 insertions(+), 7 deletions(-)

-- 
2.11.0.295.gd7dffce

Patch

diff --git a/helper/cuckootable.c b/helper/cuckootable.c
index 6a7fb215..80ff4989 100644
--- a/helper/cuckootable.c
+++ b/helper/cuckootable.c
@@ -151,12 +151,15 @@  align32pow2(uint32_t x)
 odph_table_t
 odph_cuckoo_table_lookup(const char *name)
 {
-	odph_cuckoo_table_impl *tbl;
+	odph_cuckoo_table_impl *tbl = NULL;
+	odp_shm_t shm;
 
 	if (name == NULL || strlen(name) >= ODPH_TABLE_NAME_LEN)
 		return NULL;
 
-	tbl = (odph_cuckoo_table_impl *)odp_shm_addr(odp_shm_lookup(name));
+	shm = odp_shm_lookup(name);
+	if (shm != ODP_SHM_INVALID)
+		tbl = (odph_cuckoo_table_impl *)odp_shm_addr(shm);
 	if (!tbl || tbl->magicword != ODPH_CUCKOO_TABLE_MAGIC_WORD)
 		return NULL;
 
diff --git a/helper/hashtable.c b/helper/hashtable.c
index 1c2b8523..9d411444 100644
--- a/helper/hashtable.c
+++ b/helper/hashtable.c
@@ -150,12 +150,15 @@  int odph_hash_table_destroy(odph_table_t table)
 
 odph_table_t odph_hash_table_lookup(const char *name)
 {
-	odph_hash_table_imp *hash_tbl;
+	odph_hash_table_imp *hash_tbl = NULL;
+	odp_shm_t shm;
 
 	if (name == NULL || strlen(name) >= ODPH_TABLE_NAME_LEN)
 		return NULL;
 
-	hash_tbl = (odph_hash_table_imp *)odp_shm_addr(odp_shm_lookup(name));
+	shm = odp_shm_lookup(name);
+	if (shm != ODP_SHM_INVALID)
+		hash_tbl = (odph_hash_table_imp *)odp_shm_addr(shm);
 	if (hash_tbl != NULL && strcmp(hash_tbl->name, name) == 0)
 		return (odph_table_t)hash_tbl;
 	return NULL;
diff --git a/helper/iplookuptable.c b/helper/iplookuptable.c
index 9abdab22..aae21994 100644
--- a/helper/iplookuptable.c
+++ b/helper/iplookuptable.c
@@ -419,11 +419,14 @@  odph_table_t
 odph_iplookup_table_lookup(const char *name)
 {
 	odph_iplookup_table_impl *tbl = NULL;
+	odp_shm_t shm;
 
 	if (name == NULL || strlen(name) >= ODPH_TABLE_NAME_LEN)
 		return NULL;
 
-	tbl = (odph_iplookup_table_impl *)odp_shm_addr(odp_shm_lookup(name));
+	shm = odp_shm_lookup(name);
+	if (shm != ODP_SHM_INVALID)
+		tbl = (odph_iplookup_table_impl *)odp_shm_addr(shm);
 
 	if (
 		tbl != NULL &&
diff --git a/helper/lineartable.c b/helper/lineartable.c
index e1a396c1..32c4956e 100644
--- a/helper/lineartable.c
+++ b/helper/lineartable.c
@@ -128,12 +128,15 @@  int odph_linear_table_destroy(odph_table_t table)
 
 odph_table_t odph_linear_table_lookup(const char *name)
 {
-	odph_linear_table_imp *tbl;
+	odph_linear_table_imp *tbl = NULL;
+	odp_shm_t shm;
 
 	if (name == NULL || strlen(name) >= ODPH_TABLE_NAME_LEN)
 		return NULL;
 
-	tbl = (odph_linear_table_imp *)odp_shm_addr(odp_shm_lookup(name));
+	shm = odp_shm_lookup(name);
+	if (shm != ODP_SHM_INVALID)
+		tbl = (odph_linear_table_imp *)odp_shm_addr(shm);
 
 	/* check magicword to make sure the memory block is used by a table */
 	if (tbl != NULL &&