This commit adds various null pointer checks to some files in the `lib`,
`ovsdb`, and `vtep` directories to fix several Coverity defects. These
changes are grouped together as they perform similar checks, returning
early, skipping some action, or logging a warning if a null pointer is
encountered.

Signed-off-by: James Raphael Tiovalen <jamestio...@gmail.com>
Reviewed-by: Simon Horman <simon.hor...@corigine.com>
---
 lib/dp-packet.c        |  8 ++++----
 lib/dpctl.c            | 12 ++++++++++++
 lib/shash.c            |  4 ++++
 lib/sset.c             |  5 +++++
 ovsdb/jsonrpc-server.c |  2 +-
 ovsdb/monitor.c        | 11 +++++++++--
 ovsdb/ovsdb-client.c   |  7 ++++++-
 ovsdb/row.c            |  5 ++++-
 vtep/vtep-ctl.c        |  5 +++++
 9 files changed, 50 insertions(+), 9 deletions(-)

diff --git a/lib/dp-packet.c b/lib/dp-packet.c
index 6e3a8297a..a9cf4bfc1 100644
--- a/lib/dp-packet.c
+++ b/lib/dp-packet.c
@@ -357,7 +357,7 @@ void *
 dp_packet_put_zeros(struct dp_packet *b, size_t size)
 {
     void *dst = dp_packet_put_uninit(b, size);
-    memset(dst, 0, size);
+    nullable_memset(dst, 0, size);
     return dst;
 }
 
@@ -368,7 +368,7 @@ void *
 dp_packet_put(struct dp_packet *b, const void *p, size_t size)
 {
     void *dst = dp_packet_put_uninit(b, size);
-    memcpy(dst, p, size);
+    nullable_memcpy(dst, p, size);
     return dst;
 }
 
@@ -440,7 +440,7 @@ void *
 dp_packet_push_zeros(struct dp_packet *b, size_t size)
 {
     void *dst = dp_packet_push_uninit(b, size);
-    memset(dst, 0, size);
+    nullable_memset(dst, 0, size);
     return dst;
 }
 
@@ -451,7 +451,7 @@ void *
 dp_packet_push(struct dp_packet *b, const void *p, size_t size)
 {
     void *dst = dp_packet_push_uninit(b, size);
-    memcpy(dst, p, size);
+    nullable_memcpy(dst, p, size);
     return dst;
 }
 
diff --git a/lib/dpctl.c b/lib/dpctl.c
index 4394653ab..013919572 100644
--- a/lib/dpctl.c
+++ b/lib/dpctl.c
@@ -336,6 +336,12 @@ dpctl_add_if(int argc OVS_UNUSED, const char *argv[],
                 value = "";
             }
 
+            if (!key) {
+                dpctl_error(dpctl_p, 0, "key is NULL");
+                error = EINVAL;
+                goto next;
+            }
+
             if (!strcmp(key, "type")) {
                 type = value;
             } else if (!strcmp(key, "port_no")) {
@@ -454,6 +460,12 @@ dpctl_set_if(int argc, const char *argv[], struct 
dpctl_params *dpctl_p)
                 value = "";
             }
 
+            if (!key) {
+                dpctl_error(dpctl_p, 0, "key is NULL");
+                error = EINVAL;
+                goto next_destroy_args;
+            }
+
             if (!strcmp(key, "type")) {
                 if (strcmp(value, type)) {
                     dpctl_error(dpctl_p, 0,
diff --git a/lib/shash.c b/lib/shash.c
index 2bfc8eb50..b62b586fc 100644
--- a/lib/shash.c
+++ b/lib/shash.c
@@ -205,6 +205,10 @@ shash_delete(struct shash *sh, struct shash_node *node)
 char *
 shash_steal(struct shash *sh, struct shash_node *node)
 {
+    if (!node) {
+        return NULL;
+    }
+
     char *name = node->name;
 
     hmap_remove(&sh->map, &node->node);
diff --git a/lib/sset.c b/lib/sset.c
index aa1790020..fda268129 100644
--- a/lib/sset.c
+++ b/lib/sset.c
@@ -261,6 +261,11 @@ char *
 sset_pop(struct sset *set)
 {
     const char *name = SSET_FIRST(set);
+
+    if (!name) {
+        return NULL;
+    }
+
     char *copy = xstrdup(name);
     sset_delete(set, SSET_NODE_FROM_NAME(name));
     return copy;
diff --git a/ovsdb/jsonrpc-server.c b/ovsdb/jsonrpc-server.c
index 17868f5b7..5361b3c76 100644
--- a/ovsdb/jsonrpc-server.c
+++ b/ovsdb/jsonrpc-server.c
@@ -1038,7 +1038,7 @@ ovsdb_jsonrpc_session_got_request(struct 
ovsdb_jsonrpc_session *s,
                                              request->id);
     } else if (!strcmp(request->method, "get_schema")) {
         struct ovsdb *db = ovsdb_jsonrpc_lookup_db(s, request, &reply);
-        if (!reply) {
+        if (db && !reply) {
             reply = jsonrpc_create_reply(ovsdb_schema_to_json(db->schema),
                                          request->id);
         }
diff --git a/ovsdb/monitor.c b/ovsdb/monitor.c
index 01091fabe..af88b96e3 100644
--- a/ovsdb/monitor.c
+++ b/ovsdb/monitor.c
@@ -483,6 +483,9 @@ ovsdb_monitor_add_column(struct ovsdb_monitor *dbmon,
     struct ovsdb_monitor_column *c;
 
     mt = shash_find_data(&dbmon->tables, table->schema->name);
+    if (!mt) {
+        return NULL;
+    }
 
     /* Check for column duplication. Return duplicated column name. */
     if (mt->columns_index_map[column->index] != -1) {
@@ -808,10 +811,14 @@ ovsdb_monitor_table_condition_update(
         return NULL;
     }
 
-    struct ovsdb_monitor_table_condition *mtc =
-        shash_find_data(&condition->tables, table->schema->name);
     struct ovsdb_error *error;
     struct ovsdb_condition cond = OVSDB_CONDITION_INITIALIZER(&cond);
+    struct ovsdb_monitor_table_condition *mtc =
+        shash_find_data(&condition->tables, table->schema->name);
+
+    if (!mtc) {
+        return NULL;
+    }
 
     error = ovsdb_condition_from_json(table->schema, cond_json,
                                       NULL, &cond);
diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c
index 46484630d..2b12907b6 100644
--- a/ovsdb/ovsdb-client.c
+++ b/ovsdb/ovsdb-client.c
@@ -1873,6 +1873,10 @@ do_dump(struct jsonrpc *rpc, const char *database,
         n_tables = shash_count(&schema->tables);
     }
 
+    if (!tables) {
+        goto end;
+    }
+
     /* Construct transaction to retrieve entire database. */
     transaction = json_array_create_1(json_string_create(database));
     for (i = 0; i < n_tables; i++) {
@@ -1932,8 +1936,9 @@ do_dump(struct jsonrpc *rpc, const char *database,
     }
 
     jsonrpc_msg_destroy(reply);
-    shash_destroy(&custom_columns);
     free(tables);
+end:
+    shash_destroy(&custom_columns);
     ovsdb_schema_destroy(schema);
 }
 
diff --git a/ovsdb/row.c b/ovsdb/row.c
index d7bfbdd36..be19e4940 100644
--- a/ovsdb/row.c
+++ b/ovsdb/row.c
@@ -399,7 +399,10 @@ ovsdb_row_set_add_row(struct ovsdb_row_set *set, const 
struct ovsdb_row *row)
         set->rows = x2nrealloc(set->rows, &set->allocated_rows,
                                sizeof *set->rows);
     }
-    set->rows[set->n_rows++] = row;
+
+    if (set->rows) {
+        set->rows[set->n_rows++] = row;
+    }
 }
 
 struct json *
diff --git a/vtep/vtep-ctl.c b/vtep/vtep-ctl.c
index e5d99714d..bb22cc5ce 100644
--- a/vtep/vtep-ctl.c
+++ b/vtep/vtep-ctl.c
@@ -1884,6 +1884,11 @@ del_mcast_entry(struct ctl_context *ctx,
     if (ovs_list_is_empty(&mcast_mac->locators)) {
         struct shash_node *node = shash_find(mcast_shash, mac);
 
+        if (!node) {
+            VLOG_WARN("node is NULL");
+            return;
+        }
+
         vteprec_physical_locator_set_delete(ploc_set_cfg);
 
         if (local) {
-- 
2.41.0

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to