On 20 Aug 2024, at 15:55, Mike Pattrick wrote:

> Currently the error conditions in vconn_dump_flows() don't handle
> freeing memory in a consistent fashion. This can make it possible to
> reference memory after it's freed.
>
> This patch attempts to handle errors consistently. Error conditions will
> always cause memory to be freed and then that memory will never be
> referenced.
>
> Fixes: d444a914fdbd ("ovn-trace: New --ovs option to also print OpenFlow 
> flows.")
> Signed-off-by: Mike Pattrick <[email protected]>
> ---
>  lib/vconn.c | 13 +++++++++----
>  1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/lib/vconn.c b/lib/vconn.c
> index e9603432d..dcede1656 100644
> --- a/lib/vconn.c
> +++ b/lib/vconn.c
> @@ -1017,6 +1017,7 @@ recv_flow_stats_reply(struct vconn *vconn, ovs_be32 
> send_xid,
>                  VLOG_WARN_RL(&rl, "received bad reply: %s",
>                               ofp_to_string(reply->data, reply->size,
>                                             NULL, NULL, 1));
> +                ofpbuf_delete(reply);
>                  return EPROTO;
>              }
>          }
> @@ -1041,6 +1042,7 @@ recv_flow_stats_reply(struct vconn *vconn, ovs_be32 
> send_xid,
>          default:
>              VLOG_WARN_RL(&rl, "parse error in reply (%s)",
>                           ofperr_to_string(retval));
> +            ofpbuf_delete(reply);

If we delete the buffer, we should also set the replyp back to NULL, for 
consistency, this will also remove the additional check below for 
ofpbuf_delete().

>              return EPROTO;
>          }
>      }
> @@ -1079,16 +1081,19 @@ vconn_dump_flows(struct vconn *vconn,

If we set the replyp to NULL above, i.e. relative to the state it’s in, we do 
not need the changes below.

>          struct ofputil_flow_stats *fs = &fses[n_fses];
>          error = recv_flow_stats_reply(vconn, send_xid, &reply, fs, &ofpacts);
>          if (error) {
> -            if (error == EOF) {
> -                error = 0;
> -            }
>              break;
>          }
>          fs->ofpacts = xmemdup(fs->ofpacts, fs->ofpacts_len);
>          n_fses++;
>      }
> +
>      ofpbuf_uninit(&ofpacts);
> -    ofpbuf_delete(reply);
> +
> +    if (!error) {
> +        ofpbuf_delete(reply);
> +    } else if (error == EOF) {
> +        error = 0;
> +    }
>
>      if (error) {
>          for (size_t i = 0; i < n_fses; i++) {
> -- 
> 2.43.5
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to