NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/54150: COMPAT_50 vs NET_RT_IFLIST
The following reply was made to PR kern/54150; it has been noted by GNATS.
From: Paul Goyette <paul%whooppee.com@localhost>
To: Robert Elz <kre%munnari.OZ.AU@localhost>
Cc: gnats-bugs%netbsd.org@localhost, Roy Marples <roy%marples.name@localhost>,
Matthew Green <mrg%netbsd.org@localhost>
Subject: Re: kern/54150: COMPAT_50 vs NET_RT_IFLIST
Date: Fri, 3 May 2019 13:16:14 +0800 (PST)
I think that the new hook function compat_50_iflist_addr() could be
declared static, and thus you wouldn't need to add it to net/if.h
But otherwise it looks reasonable to me.
On Fri, 3 May 2019, Robert Elz wrote:
> OK ... the patch below seems to fix this one - for the specific case
> of NetBSD 5 binaries running on a -current kernel (a patch for -8 would
> be quite different, but along the same lines).
>
> Whether this correctly handles older (older than 1.4?) binaries, or even
> NetBSD 7 (or 8) binaries I have not tested. But it should not be worse
> than it was, I think.
>
> The primary problems were the incorrect RTM_VERSION in the messages,
> and that struct ifa_msghdr has a different layout (field order changed)
> in NetBSD 5 & NetBSD 7 - so returning a NetBSD 7 format struct to a
> NetBSD 5 client does not work well.
>
> I'd appreciate it if everyone who has looked at this problem could
> take a look at this, and send comments before it gets committed.
> (Hence I have added a few cc's to this message, so people can get
> the patch in a non-gnats-mangled format ... anyone else who wants
> that send me a message off list).
>
> I am particularly wary of the RTS_CTASSERT() stuff in the new
> rt_getvers() function - that function is more or less a clone of
> rt_getlen() (which has these same RTS_CTASSERTs) and seems to
> work ok, on amd64 anyway. Whether this will work on i386 (and
> other 32 bit systems) I have no idea.
>
> The companion PR (for "route monitor") I have not yet investigated
> (except to discover that it is not as simple as I thought it might be.)
>
> kre
>
> ps: IMNSHO, way too many files need to be touched to add a new hook.
>
> I would suggest that we need a better way, where it just needs to be
> defined (one place) and then used (wherever needed) and nothing else
> needs to be manually edited - all the bookkeeping should be handled
> automatically.
>
>
> Index: compat/common/rtsock_50.c
> ===================================================================
> RCS file: /cvsroot/src/sys/compat/common/rtsock_50.c,v
> retrieving revision 1.13
> diff -u -r1.13 rtsock_50.c
> --- compat/common/rtsock_50.c 29 Apr 2019 16:12:30 -0000 1.13
> +++ compat/common/rtsock_50.c 3 May 2019 04:26:38 -0000
> @@ -151,6 +151,28 @@
> return 0;
> }
>
> +int
> +compat_50_iflist_addr(struct rt_walkarg *w, struct ifaddr *ifa,
> + struct rt_addrinfo *info)
> +{
> + int len, error;
> +
> + if ((error = rt_msg3(RTM_ONEWADDR, info, 0, w, &len)))
> + return error;
> + if (w->w_where && w->w_tmem && w->w_needed <= 0) {
> + struct ifa_msghdr50 *ifam;
> +
> + ifam = (struct ifa_msghdr50 *)w->w_tmem;
> + ifam->ifam_index = ifa->ifa_ifp->if_index;
> + ifam->ifam_flags = ifa->ifa_flags;
> + ifam->ifam_metric = ifa->ifa_metric;
> + ifam->ifam_addrs = info->rti_addrs;
> + if ((error = copyout(w->w_tmem, w->w_where, len)) == 0)
> + w->w_where = (char *)w->w_where + len;
> + }
> + return error;
> +}
> +
> void
> rtsock_50_init(void)
> {
> @@ -170,6 +192,8 @@
> compat_50_rt_ifannouncemsg);
> MODULE_HOOK_SET(rtsock_rt_ieee80211msg_50_hook, "rts_50",
> compat_50_rt_ieee80211msg);
> + MODULE_HOOK_SET(rtsock_iflist_addr_50_hook, "rts_50",
> + compat_50_iflist_addr);
> sysctl_net_route_setup(&clog, PF_OROUTE, "ortable");
> }
>
> @@ -187,4 +211,5 @@
> MODULE_HOOK_UNSET(rtsock_rt_addrmsg_50_hook);
> MODULE_HOOK_UNSET(rtsock_rt_ifannouncemsg_50_hook);
> MODULE_HOOK_UNSET(rtsock_rt_ieee80211msg_50_hook);
> + MODULE_HOOK_UNSET(rtsock_iflist_addr_50_hook);
> }
> Index: compat/net/if.h
> ===================================================================
> RCS file: /cvsroot/src/sys/compat/net/if.h,v
> retrieving revision 1.4
> diff -u -r1.4 if.h
> --- compat/net/if.h 21 Sep 2016 10:50:23 -0000 1.4
> +++ compat/net/if.h 3 May 2019 04:26:38 -0000
> @@ -171,6 +171,9 @@
> int ifam_metric; /* value of ifa_metric */
> };
>
> +int compat_50_iflist_addr(struct rt_walkarg *, struct ifaddr *,
> + struct rt_addrinfo *);
> +
> /*
> * Message format announcing the arrival or departure of a network interface.
> */
> Index: kern/compat_stub.c
> ===================================================================
> RCS file: /cvsroot/src/sys/kern/compat_stub.c,v
> retrieving revision 1.11
> diff -u -r1.11 compat_stub.c
> --- kern/compat_stub.c 29 Apr 2019 16:12:30 -0000 1.11
> +++ kern/compat_stub.c 3 May 2019 04:26:46 -0000
> @@ -207,6 +207,7 @@
> struct rtsock_rt_addrmsg_src_50_hook_t rtsock_rt_addrmsg_src_50_hook;
> struct rtsock_rt_addrmsg_50_hook_t rtsock_rt_addrmsg_50_hook;
> struct rtsock_rt_ieee80211msg_50_hook_t rtsock_rt_ieee80211msg_50_hook;
> +struct rtsock_iflist_addr_50_hook_t rtsock_iflist_addr_50_hook;
>
> /*
> * rtsock 70 compatability
> Index: net/rtsock.c
> ===================================================================
> RCS file: /cvsroot/src/sys/net/rtsock.c,v
> retrieving revision 1.249
> diff -u -r1.249 rtsock.c
> --- net/rtsock.c 29 Apr 2019 05:42:09 -0000 1.249
> +++ net/rtsock.c 3 May 2019 04:26:49 -0000
> @@ -364,9 +364,12 @@
> error = sysctl_iflist_addr(w, ifa, &info);
> break;
> case NET_RT_OIFLIST:
> + MODULE_HOOK_CALL(rtsock_iflist_70_hook,
> + (w, ifa, &info), enosys(), error);
> + break;
> case NET_RT_OOIFLIST:
> case NET_RT_OOOIFLIST:
> - MODULE_HOOK_CALL(rtsock_iflist_70_hook,
> + MODULE_HOOK_CALL(rtsock_iflist_addr_50_hook,
> (w, ifa, &info), enosys(), error);
> break;
> default:
> Index: net/rtsock_shared.c
> ===================================================================
> RCS file: /cvsroot/src/sys/net/rtsock_shared.c,v
> retrieving revision 1.8
> diff -u -r1.8 rtsock_shared.c
> --- net/rtsock_shared.c 29 Apr 2019 16:12:30 -0000 1.8
> +++ net/rtsock_shared.c 3 May 2019 04:26:50 -0000
> @@ -1159,6 +1159,67 @@
> }
>
>
> +static int
> +rt_getvers(int type)
> +{
> + RTS_CTASSERT(__alignof(struct ifa_msghdr) >= sizeof(uint64_t));
> + RTS_CTASSERT(__alignof(struct if_msghdr) >= sizeof(uint64_t));
> + RTS_CTASSERT(__alignof(struct if_announcemsghdr) >= sizeof(uint64_t));
> + RTS_CTASSERT(__alignof(struct rt_msghdr) >= sizeof(uint64_t));
> +
> + switch (type) {
> + case RTM_ODELADDR:
> + case RTM_ONEWADDR:
> + case RTM_OCHGADDR:
> + if (rtsock_iflist_70_hook.hooked)
> + return RTM_OVERSION;
> + else {
> +#ifdef RTSOCK_DEBUG
> + printf("%s: unsupported RTM type %d\n", __func__, type);
> +#endif
> + return -1;
> + }
> +
> + case RTM_DELADDR:
> + case RTM_NEWADDR:
> + case RTM_CHGADDR:
> + return RTM_VERSION;
> +
> + case RTM_OOIFINFO:
> + if (rtsock_iflist_14_hook.hooked)
> + return RTM_OVERSION;
> + else {
> +#ifdef RTSOCK_DEBUG
> + printf("%s: unsupported RTM type RTM_OOIFINFO\n",
> + __func__);
> +#endif
> + return -1;
> + }
> +
> + case RTM_OIFINFO:
> + if (rtsock_iflist_50_hook.hooked)
> + return RTM_OVERSION;
> + else {
> +#ifdef RTSOCK_DEBUG
> + printf("%s: unsupported RTM type RTM_OIFINFO\n",
> + __func__);
> +#endif
> + return -1;
> + }
> +
> + case RTM_IFINFO:
> + return RTM_VERSION;
> +
> + case RTM_IFANNOUNCE:
> + case RTM_IEEE80211:
> + return RTM_VERSION;
> +
> + default:
> + return RTM_XVERSION;
> + }
> +}
> +
> +
> struct mbuf *
> COMPATNAME(rt_msg1)(int type, struct rt_addrinfo *rtinfo, void *data, int datalen)
> {
> @@ -1212,7 +1273,7 @@
> if (m->m_pkthdr.len != len)
> goto out;
> rtm->rtm_msglen = len;
> - rtm->rtm_version = RTM_XVERSION;
> + rtm->rtm_version = rt_getvers(type);
> rtm->rtm_type = type;
> return m;
> out:
> @@ -1290,7 +1351,7 @@
> if (cp) {
> struct rt_xmsghdr *rtm = (struct rt_xmsghdr *)cp0;
>
> - rtm->rtm_version = RTM_XVERSION;
> + rtm->rtm_version = rt_getvers(type);
> rtm->rtm_type = type;
> rtm->rtm_msglen = len;
> }
> Index: sys/compat_stub.h
> ===================================================================
> RCS file: /cvsroot/src/sys/sys/compat_stub.h,v
> retrieving revision 1.15
> diff -u -r1.15 compat_stub.h
> --- sys/compat_stub.h 29 Apr 2019 16:12:30 -0000 1.15
> +++ sys/compat_stub.h 3 May 2019 04:26:51 -0000
> @@ -269,6 +269,8 @@
> MODULE_HOOK(rtsock_rt_ifannouncemsg_50_hook, void, (struct ifnet *, int));
> MODULE_HOOK(rtsock_rt_ieee80211msg_50_hook, void,
> (struct ifnet *, int, void *, size_t));
> +MODULE_HOOK(rtsock_iflist_addr_50_hook, int,
> + (struct rt_walkarg *, struct ifaddr *, struct rt_addrinfo *));
>
> /*
> * Hooks for rtsock_70
>
>
>
> !DSPAM:5ccbc7c0112531254785785!
>
>
+--------------------+--------------------------+-----------------------+
| Paul Goyette | PGP Key fingerprint: | E-mail addresses: |
| (Retired) | FA29 0E3B 35AF E8AE 6651 | paul%whooppee.com@localhost |
| Software Developer | 0786 F758 55DE 53BA 7731 | pgoyette%netbsd.org@localhost |
+--------------------+--------------------------+-----------------------+
Home |
Main Index |
Thread Index |
Old Index