Fix ovn-trace core dump with unknown logical port

Fixes: 4735d397a400 ("ovn-trace: New utility")
Signed-off-by: Lorenzo Bianconi <lorenzo.bianc...@redhat.com>
---
 utilities/ovn-trace.c | 29 +++++++++++++++++------------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/utilities/ovn-trace.c b/utilities/ovn-trace.c
index 6fad36512..e4ea118d0 100644
--- a/utilities/ovn-trace.c
+++ b/utilities/ovn-trace.c
@@ -1127,10 +1127,13 @@ ovntrace_lookup_port(const void *dp_, const char 
*port_name,
         return false;
     }
 
-    const struct ovntrace_mcgroup *mcgroup = ovntrace_mcgroup_find_by_name(dp, 
port_name);
-    if (mcgroup) {
-        *portp = mcgroup->tunnel_key;
-        return true;
+    if (dp) {
+        const struct ovntrace_mcgroup *mcgroup =
+            ovntrace_mcgroup_find_by_name(dp, port_name);
+        if (mcgroup) {
+            *portp = mcgroup->tunnel_key;
+            return true;
+        }
     }
 
     VLOG_WARN("%s: unknown logical port", port_name);
@@ -2604,13 +2607,15 @@ trace__(const struct ovntrace_datapath *dp, struct flow 
*uflow,
         uint8_t table_id, enum ovnact_pipeline pipeline,
         struct ovs_list *super)
 {
-    const struct ovntrace_flow *f;
-    for (;;) {
-        f = ovntrace_flow_lookup(dp, uflow, table_id, pipeline);
-        if (!may_omit_stage(f, table_id)) {
-            break;
+    const struct ovntrace_flow *f = NULL;
+    if (dp) {
+        for (;;) {
+            f = ovntrace_flow_lookup(dp, uflow, table_id, pipeline);
+            if (!may_omit_stage(f, table_id)) {
+                break;
+            }
+            table_id++;
         }
-        table_id++;
     }
 
     struct ds s = DS_EMPTY_INITIALIZER;
@@ -2625,7 +2630,7 @@ trace__(const struct ovntrace_datapath *dp, struct flow 
*uflow,
         }
         ds_put_format(&s, "%s, priority %d, uuid %08x",
                       f->match_s, f->priority, f->uuid.parts[0]);
-    } else {
+    } else if (dp) {
         char *stage_name = ovntrace_stage_name(dp, table_id, pipeline);
         ds_put_format(&s, "%s%sno match (implicit drop)",
                       stage_name ? stage_name : "",
@@ -2738,7 +2743,7 @@ trace(const char *dp_s, const char *flow_s)
     struct ovs_list root = OVS_LIST_INITIALIZER(&root);
     struct ovntrace_node *node = ovntrace_node_append(
         &root, OVNTRACE_NODE_PIPELINE, "ingress(dp=\"%s\", inport=\"%s\")",
-        dp->friendly_name, inport_name);
+        dp ? dp->friendly_name : "", inport_name);
     trace__(dp, &uflow, 0, OVNACT_P_INGRESS, &node->subs);
 
     bool multiple = (detailed + summary + minimal) > 1;
-- 
2.29.2

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

Reply via email to