From: Stephen Hemminger <stephen@networkplumber.org>
To: Phil Sutter <phil@nwl.cc>
Cc: netdev@vger.kernel.org, "Élie Bouttier" <elie@bouttier.eu>
Subject: Re: [iproute PATCH] ip-route: Propagate errors from parse_one_nh()
Date: Wed, 24 Jan 2018 07:44:42 -0800 [thread overview]
Message-ID: <20180124074442.6790409f@xeon-e3> (raw)
In-Reply-To: <20180124091924.GF1008@orbyte.nwl.cc>
On Wed, 24 Jan 2018 10:19:24 +0100
Phil Sutter <phil@nwl.cc> wrote:
> Hi Stephen,
>
> On Tue, Jan 23, 2018 at 02:44:42PM -0800, Stephen Hemminger wrote:
> > On Tue, 23 Jan 2018 17:40:47 +0100
> > Phil Sutter <phil@nwl.cc> wrote:
> >
> > > The following command segfaults if enp0s31f6 does not exist:
> > >
> > > | # ip -6 route add default proto ra metric 20100 \
> > > | nexthop via fe80:52:0:2040::1fc dev enp0s31f6 weight 1 \
> > > | nexthop via fe80:52:0:2040::1fe dev enp0s31f6 weight 1
> > >
> > > Since the non-zero return code from parse_one_nh() is ignored,
> > > parse_nexthops() continues iterating over the the same fields in argv
> > > until buffer space is exhausted and eventually accesses unallocated
> > > memory.
> > >
> > > Fix this by aborting on error in parse_nexthops() and make
> > > iproute_modify() fail if parse_nexthops() did.
> > >
> > > Reported-by: Lennart Poettering <lpoetter@redhat.com>
> > > Fixes: 2f406f2d0b4ef ("ip route: replace exits with returns")
> > > Signed-off-by: Phil Sutter <phil@nwl.cc>
> > > ---
> > > ip/iproute.c | 7 ++++---
> > > 1 file changed, 4 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/ip/iproute.c b/ip/iproute.c
> > > index bf886fda9d761..d7accf57ac8d1 100644
> > > --- a/ip/iproute.c
> > > +++ b/ip/iproute.c
> > > @@ -871,7 +871,8 @@ static int parse_nexthops(struct nlmsghdr *n, struct rtmsg *r,
> > > memset(rtnh, 0, sizeof(*rtnh));
> > > rtnh->rtnh_len = sizeof(*rtnh);
> > > rta->rta_len += rtnh->rtnh_len;
> > > - parse_one_nh(n, r, rta, rtnh, &argc, &argv);
> > > + if (parse_one_nh(n, r, rta, rtnh, &argc, &argv) < 0)
> > > + return -1;
> > > rtnh = RTNH_NEXT(rtnh);
> > > }
> > >
> > > @@ -1318,8 +1319,8 @@ static int iproute_modify(int cmd, unsigned int flags, int argc, char **argv)
> > > addattr_l(&req.n, sizeof(req), RTA_METRICS, RTA_DATA(mxrta), RTA_PAYLOAD(mxrta));
> > > }
> > >
> > > - if (nhs_ok)
> > > - parse_nexthops(&req.n, &req.r, argc, argv);
> > > + if (nhs_ok && parse_nexthops(&req.n, &req.r, argc, argv) < 0)
> > > + return -1;
> > >
> > > if (req.r.rtm_family == AF_UNSPEC)
> > > req.r.rtm_family = AF_INET;
> >
> >
> > The real issue is that handling of invalid device is different than all the other
> > possible semantic errors.
> >
> > My recommendations are:
> > * change bad device to use invarg() which does exit
> > * make functions that only return 0 void including
> > parse_one_nh
> > lwt_parse_encap
> > get_addr
> >
> > Also, it looks like read_family converts any address family it doesn't know about to unspec
> > that is stupid behavior as well.
> >
> > The original commit 2f406f2d0b4ef ("ip route: replace exits with returns")
> > looks like well intentioned but suspect. Most of the errors in ip route
> > indicate real issues where continuing is not a good plan.
>
> You're right, the use of invarg() for any other error effectively
> prevents what said commit tried to achieve, so my fix is pretty
> pointless in that regard. Yet I wonder why we still have 'ip -batch
> -force' given that it's not useful. Maybe Élie is able to provide some
> details about the use-case said commit tried to fix?
>
> Meanwhile I'll prepare some patches to address the shortcomings you
> mentioned above.
The use case for batch (and force) is that there may be a large set of routes
or qdisc operations where it is ok for some of them to fail because of responses
from the kernel failing. I don't think batch should ever just continue if handed
invalid syntax for device or address. There are some borderline cases, for example
if a tunnel device could not be created and later steps depend on that name.
Agree, lets get some real data on why the original patch was done.
next prev parent reply other threads:[~2018-01-24 15:44 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-23 16:40 [iproute PATCH] ip-route: Propagate errors from parse_one_nh() Phil Sutter
2018-01-23 22:44 ` Stephen Hemminger
2018-01-24 9:19 ` Phil Sutter
2018-01-24 15:44 ` Stephen Hemminger [this message]
2018-02-08 13:26 ` Élie Bouttier
2018-02-08 14:11 ` Phil Sutter
2018-01-24 11:08 ` Phil Sutter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180124074442.6790409f@xeon-e3 \
--to=stephen@networkplumber.org \
--cc=elie@bouttier.eu \
--cc=netdev@vger.kernel.org \
--cc=phil@nwl.cc \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).