fre. 17. jan. 2025, 14:56 skrev Eelco Chaudron <[email protected]>:

>
>
> On 13 Jan 2025, at 21:45, Frode Nordahl wrote:
>
> > Hello,
> >
> > This is a continuation of the work started in [0], which has gone
> > through a couple of iterations by Felix Huettner [1][2].
> >
> > As agreed in the OVN A/V Community meeting December 2nd 2024, I took
> > over herding these patches again.
> >
> > The main rationale for this is that I have done a fair bit of work on
> > Netlink related code before, so it would be a good way to spread the
> > workload of this epic, with the goal of getting the most out of this
> > community effort prior to looming freeze deadlines.
> >
> > Main change from previous iterations is:
> > * Series has been properly separated into logical units of change.
> > * Nexthops stored as a linked list as opposed to fixed size array.
> > * Support for parsing IPv4 routes over IPv6 next hops through the use
> >   of the RTA_VIA attribute.
> > * As agreed the namespaces code proposed by Felix Huettner has been
> >   dropped.
> > * More complete tests have been provided.
>
> Hi Frode,
>
> I received a message from Coverity indicating a potential memory leak. It
> seems this would only occur in cases where we encounter an invalid route
> message, but it might be a good idea to safeguard against it. Could you
> take a look and submit a follow-up patch?
>

Thanks for catching and reporting this, and sorry for the bug.

The logic for cleanup assumes rdnh will always be added to the list, but
then I apparently chose to skip that when processing the outer message with
a RTA_MULTIPATH attribute, presumably because its nexthop attributes will
be added when recursing, and the list element would be redundant.

Will work and post a fix at first opportunity.

--
Frode Nordahl

Here is the report:
>
> New defect(s) Reported-by: Coverity Scan
> Showing 1 of 1 defect(s)
>
>
> ** CID 485681:    (RESOURCE_LEAK)
> /lib/route-table.c: 307 in route_table_parse__()
> /lib/route-table.c: 321 in route_table_parse__()
> /lib/route-table.c: 408 in route_table_parse__()
> /lib/route-table.c: 369 in route_table_parse__()
>
>
>
> ________________________________________________________________________________________________________
> *** CID 485681:    (RESOURCE_LEAK)
> /lib/route-table.c: 307 in route_table_parse__()
> 301             change->rd.rtm_dst_len = rtm->rtm_dst_len;
> 302             change->rd.rtm_protocol = rtm->rtm_protocol;
> 303             change->rd.rtn_local = rtm->rtm_type == RTN_LOCAL;
> 304             if (attrs[RTA_OIF] && rtnh) {
> 305                 VLOG_DBG_RL(&rl, "unexpected RTA_OIF attribute while
> parsing "
> 306                                  "nested RTA_MULTIPATH attributes");
>     CID 485681:    (RESOURCE_LEAK)
>     Variable "rdnh" going out of scope leaks the storage it points to.
> 307                 goto error_out;
> 308             }
> 309             if (attrs[RTA_OIF] || rtnh) {
> 310                 rta_oif = rtnh ? rtnh->rtnh_ifindex
> 311                                : nl_attr_get_u32(attrs[RTA_OIF]);
> 312
> /lib/route-table.c: 321 in route_table_parse__()
> 315
> 316                     VLOG_DBG_RL(&rl, "could not find interface
> name[%u]: %s",
> 317                                 rta_oif, ovs_strerror(error));
> 318                     if (error == ENXIO) {
> 319                         change->relevant = false;
> 320                     } else {
>     CID 485681:    (RESOURCE_LEAK)
>     Variable "rdnh" going out of scope leaks the storage it points to.
> 321                         goto error_out;
> 322                     }
> 323                 }
> 324             }
> 325
> 326             if (attrs[RTA_DST]) {
> /lib/route-table.c: 408 in route_table_parse__()
> 402             if (attrs[RTA_MULTIPATH]) {
> 403                 const struct nlattr *nla;
> 404                 size_t left;
> 405
> 406                 if (rtnh) {
> 407                     VLOG_DBG_RL(&rl, "unexpected nested RTA_MULTIPATH
> attribute");
>     CID 485681:    (RESOURCE_LEAK)
>     Variable "rdnh" going out of scope leaks the storage it points to.
> 408                     goto error_out;
> 409                 }
> 410
> 411                 NL_NESTED_FOR_EACH (nla, left, attrs[RTA_MULTIPATH]) {
> 412                     struct route_table_msg mp_change;
> 413                     struct rtnexthop *mp_rtnh;
> /lib/route-table.c: 369 in route_table_parse__()
> 363                 const struct rtvia *rtvia =
> nl_attr_get(attrs[RTA_VIA]);
> 364                 ovs_be32 addr;
> 365
> 366                 if (attrs[RTA_GATEWAY]) {
> 367                     VLOG_DBG_RL(&rl, "route message can not contain
> both "
> 368                                      "RTA_GATEWAY and RTA_VIA");
>     CID 485681:    (RESOURCE_LEAK)
>     Variable "rdnh" going out of scope leaks the storage it points to.
> 369                     goto error_out;
> 370                 }
> 371
> 372                 rdnh->family = rtvia->rtvia_family;
> 373
> 374                 switch (rdnh->family) {
>
>
> Cheers,
>
> Eelco
>
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to