On Sat, Jan 21, 2017 at 07:31:20AM +0100, Claudio Jeker wrote:
> Next piece of the puzzle. Cleanup the error handling a bit.
> If the route message is not valid (syntactically or also because it
> references bad things) fail without broadcasting this message to all
> listeners. So make sure that until the info struct has been checked we only
> use goto fail instead of goto flush.
> While there remove some redundant checks which are not needed.
>
> OK?
OK bluhm@
> --
> :wq Claudio
>
> Index: net/rtsock.c
> ===================================================================
> RCS file: /cvs/src/sys/net/rtsock.c,v
> retrieving revision 1.215
> diff -u -p -r1.215 rtsock.c
> --- net/rtsock.c 21 Jan 2017 03:44:46 -0000 1.215
> +++ net/rtsock.c 21 Jan 2017 06:23:02 -0000
> @@ -488,7 +488,6 @@ route_output(struct mbuf *m, ...)
> so = va_arg(ap, struct socket *);
> va_end(ap);
>
> - info.rti_info[RTAX_DST] = NULL; /* for error handling (goto flush) */
> if (m == NULL || ((m->m_len < sizeof(int32_t)) &&
> (m = m_pullup(m, sizeof(int32_t))) == 0))
> return (ENOBUFS);
> @@ -555,10 +554,10 @@ route_output(struct mbuf *m, ...)
> if (!rtable_exists(tableid)) {
> if (rtm->rtm_type == RTM_ADD) {
> if ((error = rtable_add(tableid)) != 0)
> - goto flush;
> + goto fail;
> } else {
> error = EINVAL;
> - goto flush;
> + goto fail;
> }
> }
>
> @@ -598,7 +597,7 @@ route_output(struct mbuf *m, ...)
> info.rti_info[RTAX_GATEWAY]->sa_family >= AF_MAX) ||
> info.rti_info[RTAX_GENMASK] != NULL) {
> error = EINVAL;
> - goto flush;
> + goto fail;
> }
> #ifdef MPLS
> info.rti_mpls = rtm->rtm_mpls;
> @@ -610,6 +609,11 @@ route_output(struct mbuf *m, ...)
> info.rti_flags |= RTF_LLINFO;
> }
>
> + /*
> + * Do not use goto flush before this point since the message itself
> + * may be not consistent and could cause unexpected behaviour in other
> + * userland clients. Use goto fail instead.
> + */
> switch (rtm->rtm_type) {
> case RTM_ADD:
> if (info.rti_info[RTAX_GATEWAY] == NULL) {
> @@ -647,11 +651,6 @@ route_output(struct mbuf *m, ...)
> }
> break;
> case RTM_DELETE:
> - if (!rtable_exists(tableid)) {
> - error = EAFNOSUPPORT;
> - goto flush;
> - }
> -
> rt = rtable_lookup(tableid, info.rti_info[RTAX_DST],
> info.rti_info[RTAX_NETMASK], info.rti_info[RTAX_GATEWAY],
> prio);
> @@ -690,10 +689,6 @@ route_output(struct mbuf *m, ...)
> goto report;
> break;
> case RTM_GET:
> - if (!rtable_exists(tableid)) {
> - error = EAFNOSUPPORT;
> - goto flush;
> - }
> rt = rtable_lookup(tableid, info.rti_info[RTAX_DST],
> info.rti_info[RTAX_NETMASK], info.rti_info[RTAX_GATEWAY],
> prio);
> @@ -764,11 +759,6 @@ report:
> break;
> case RTM_CHANGE:
> case RTM_LOCK:
> - if (!rtable_exists(tableid)) {
> - error = EAFNOSUPPORT;
> - goto flush;
> - }
> -
> rt = rtable_lookup(tableid, info.rti_info[RTAX_DST],
> info.rti_info[RTAX_NETMASK], info.rti_info[RTAX_GATEWAY],
> prio);