On 1/10/24 19:05, Han Zhou wrote:
On Wed, Jan 10, 2024 at 11:26 AM Mark Michelson <mmich...@redhat.com
<mailto:mmich...@redhat.com>> wrote:
>
> A static analyzer determined that if pb->n_mac was 0, then the c_addrs
> lport_addresses struct would never be initialized. We would then use
> and attempt to free uninitialized memory.
>
> In reality, pb->n_mac should always be 1. This is because the port
binding is a
> representation of a northbound logical router port. Logical router
ports do
> not contain an array of MACs like the southbound port bindings do.
Instead,
> they have a single MAC string that is always guaranteed to be
non-NULL. This
> string is copied into the port binding's MAC array. Therefore, a
southbound
> port binding that comes from a logical router port will always have
n_mac set
> to 1.
>
> How do we know this is a logical router port? The ports iterated over
in this
> function must have IPv6 prefix delegation configured on them. Only
northbound
> logical router ports have this option available.
>
> To silence the static analyzer, this change directly retrieves pb->mac[0]
> instead of iterating over the pb->mac array. As a safeguard, we ensure
> that the port binding has only one MAC before attempting to access it.
> This is based on the off chance that something other than northd has
> inserted the port binding into the southbound database.
>
> Reported-at: https://issues.redhat.com/browse/FDP-224
<https://issues.redhat.com/browse/FDP-224>
>
> Signed-off-by: Mark Michelson <mmich...@redhat.com
<mailto:mmich...@redhat.com>>
> ---
> controller/pinctrl.c | 22 ++++++++++++++++++----
> 1 file changed, 18 insertions(+), 4 deletions(-)
>
> diff --git a/controller/pinctrl.c b/controller/pinctrl.c
> index 12055a675..49a56cf81 100644
> --- a/controller/pinctrl.c
> +++ b/controller/pinctrl.c
> @@ -1286,11 +1286,25 @@ fill_ipv6_prefix_state(struct ovsdb_idl_txn
*ovnsb_idl_txn,
> continue;
> }
>
> + /* To reach this point, the port binding must be a logical
router
> + * port. LRPs are configured with a single MAC that is
always non-NULL.
> + * Therefore, as long as we are working with a port_binding
that was
> + * inserted into the southbound database by northd, we can
always
> + * safely extract pb->mac[0] since it will be non-NULL.
> + *
> + * However, if a port_binding was inserted by someone else,
then we
> + * need to double-check our assumption first.
> + */
> + if (pb->n_mac != 1) {
> + static struct vlog_rate_limit rl =
VLOG_RATE_LIMIT_INIT(1, 5);
> + VLOG_ERR_RL(&rl, "Port binding "UUID_FMT" has
%"PRIuSIZE" MACs "
> + "instead of 1", UUID_ARGS(&pb->header_.uuid),
> + pb->n_mac);
> + continue;
> + }
> struct lport_addresses c_addrs;
> - for (size_t j = 0; j < pb->n_mac; j++) {
> - if (extract_lsp_addresses(pb->mac[j], &c_addrs)) {
> - break;
> - }
> + if (!extract_lsp_addresses(pb->mac[0], &c_addrs)) {
> + continue;
> }
>
> pfd = shash_find_data(&ipv6_prefixd, pb->logical_port);
> --
> 2.40.1
>
Thanks Mark.
Acked-by: Han Zhou <hz...@ovn.org <mailto:hz...@ovn.org>>
Thanks for the review, Han. I pushed this change to main and all
branches back to 22.03.
> _______________________________________________
> dev mailing list
> d...@openvswitch.org <mailto:d...@openvswitch.org>
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
<https://mail.openvswitch.org/mailman/listinfo/ovs-dev>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev