On Tue, 25 Nov 2014 16:43:16 +0100, Martin Pieuchot wrote: > Diff below removes the non-needed usages of "struct route" & friends in > pf.c, any comment or ok?
You are missing some initializations of rt to NULL, comments inline. - todd > Index: net/pf.c > =================================================================== > RCS file: /home/ncvs/src/sys/net/pf.c,v > retrieving revision 1.896 > diff -u -p -r1.896 pf.c > --- net/pf.c 20 Nov 2014 13:54:24 -0000 1.896 > +++ net/pf.c 25 Nov 2014 14:58:42 -0000 > @@ -2952,42 +2952,36 @@ pf_calc_mss(struct pf_addr *addr, sa_fam > { > #ifdef INET > struct sockaddr_in *dst; > - struct route ro; > #endif /* INET */ > #ifdef INET6 > struct sockaddr_in6 *dst6; > - struct route_in6 ro6; > #endif /* INET6 */ > struct rtentry *rt = NULL; > + struct sockaddr_storage ss; > int hlen; > u_int16_t mss = tcp_mssdflt; > > + memset(&ss, 0, sizeof(ss)); > + > switch (af) { > #ifdef INET > case AF_INET: > hlen = sizeof(struct ip); > - bzero(&ro, sizeof(ro)); > - dst = (struct sockaddr_in *)&ro.ro_dst; > + dst = (struct sockaddr_in *)&ss; > dst->sin_family = AF_INET; > dst->sin_len = sizeof(*dst); > dst->sin_addr = addr->v4; > - ro.ro_tableid = rtableid; > - ro.ro_rt = rtalloc(&ro.ro_dst, RT_REPORT, ro.ro_tableid); > - rt = ro.ro_rt; > + rt = rtalloc(sintosa(dst), RT_REPORT, rtableid); > break; > #endif /* INET */ > #ifdef INET6 > case AF_INET6: > hlen = sizeof(struct ip6_hdr); > - bzero(&ro6, sizeof(ro6)); > - dst6 = (struct sockaddr_in6 *)&ro6.ro_dst; > + dst6 = (struct sockaddr_in6 *)&ss; > dst6->sin6_family = AF_INET6; > dst6->sin6_len = sizeof(*dst6); > dst6->sin6_addr = addr->v6; > - ro6.ro_tableid = rtableid; > - ro6.ro_rt = rtalloc(sin6tosa(&ro6.ro_dst), RT_REPORT, > - ro6.ro_tableid); > - rt = ro6.ro_rt; > + rt = rtalloc(sin6tosa(dst6), RT_REPORT, rtableid); > break; > #endif /* INET6 */ > } > @@ -5396,25 +5390,22 @@ int > pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *kif, > int rtableid) > { > + struct sockaddr_storage ss; > struct sockaddr_in *dst; > int ret = 1; > int check_mpath; > #ifdef INET6 > struct sockaddr_in6 *dst6; > - struct route_in6 ro; > -#else > - struct route ro; > #endif > struct rtentry *rt; You need to initialize rt to NULL, otherwise the "goto out" will rtfree a wild pointer. > struct ifnet *ifp; > > check_mpath = 0; > - bzero(&ro, sizeof(ro)); > - ro.ro_tableid = rtableid; > + memset(&ss, 0, sizeof(ss)); > switch (af) { > #ifdef INET > case AF_INET: > - dst = (struct sockaddr_in *)&ro.ro_dst; > + dst = (struct sockaddr_in *)&ss; > dst->sin_family = AF_INET; > dst->sin_len = sizeof(*dst); > dst->sin_addr = addr->v4; > @@ -5430,7 +5421,7 @@ pf_routable(struct pf_addr *addr, sa_fam > */ > if (IN6_IS_SCOPE_EMBED(&addr->v6)) > goto out; > - dst6 = &ro.ro_dst; > + dst6 = (struct sockaddr_in6 *)&ss; > dst6->sin6_family = AF_INET6; > dst6->sin6_len = sizeof(*dst6); > dst6->sin6_addr = addr->v6; > @@ -5444,10 +5435,8 @@ pf_routable(struct pf_addr *addr, sa_fam > if (kif != NULL && kif->pfik_ifp->if_type == IFT_ENC) > goto out; > > - ro.ro_rt = rtalloc((struct sockaddr *)&ro.ro_dst, RT_REPORT, > - ro.ro_tableid); > - > - if (ro.ro_rt != NULL) { > + rt = rtalloc((struct sockaddr *)&ss, RT_REPORT, rtableid); > + if (rt != NULL) { > /* No interface given, this is a no-route check */ > if (kif == NULL) > goto out; > @@ -5459,7 +5448,6 @@ pf_routable(struct pf_addr *addr, sa_fam > > /* Perform uRPF check if passed input interface */ > ret = 0; > - rt = ro.ro_rt; > do { > if (rt->rt_ifp->if_type == IFT_CARP) > ifp = rt->rt_ifp->if_carpdev; > @@ -5473,8 +5461,8 @@ pf_routable(struct pf_addr *addr, sa_fam > } else > ret = 0; > out: > - if (ro.ro_rt != NULL) > - rtfree(ro.ro_rt); > + if (rt != NULL) > + rtfree(rt); > return (ret); > } > > @@ -5482,21 +5470,19 @@ int > pf_rtlabel_match(struct pf_addr *addr, sa_family_t af, struct pf_addr_wrap * > aw, > int rtableid) > { > + struct sockaddr_storage ss; > struct sockaddr_in *dst; > #ifdef INET6 > struct sockaddr_in6 *dst6; > - struct route_in6 ro; > -#else > - struct route ro; > #endif > + struct rtentry *rt; > int ret = 0; > > - bzero(&ro, sizeof(ro)); > - ro.ro_tableid = rtableid; > + memset(&ss, 0, sizeof(ss)); > switch (af) { > #ifdef INET > case AF_INET: > - dst = (struct sockaddr_in *)(&ro.ro_dst); > + dst = (struct sockaddr_in *)&ss; > dst->sin_family = AF_INET; > dst->sin_len = sizeof(*dst); > dst->sin_addr = addr->v4; > @@ -5504,7 +5490,7 @@ pf_rtlabel_match(struct pf_addr *addr, s > #endif /* INET */ > #ifdef INET6 > case AF_INET6: > - dst6 = &ro.ro_dst; > + dst6 = (struct sockaddr_in6 *)&ss; > dst6->sin6_family = AF_INET6; > dst6->sin6_len = sizeof(*dst6); > dst6->sin6_addr = addr->v6; > @@ -5512,13 +5498,11 @@ pf_rtlabel_match(struct pf_addr *addr, s > #endif /* INET6 */ > } > > - ro.ro_rt = rtalloc((struct sockaddr *)&ro.ro_dst, RT_REPORT, > - ro.ro_tableid); > - > - if (ro.ro_rt != NULL) { > - if (ro.ro_rt->rt_labelid == aw->v.rtlabel) > + rt = rtalloc((struct sockaddr *)&ss, RT_REPORT|RT_RESOLVE, rtableid); > + if (rt != NULL) { > + if (rt->rt_labelid == aw->v.rtlabel) > ret = 1; > - rtfree(ro.ro_rt); > + rtfree(rt); > } > > return (ret); > @@ -5530,14 +5514,14 @@ pf_route(struct mbuf **m, struct pf_rule > struct pf_state *s) > { > struct mbuf *m0, *m1; > - struct route iproute; > - struct route *ro = NULL; > - struct sockaddr_in *dst; > + struct rtentry *rt; Here too, for the rtfree() at done: > + struct sockaddr_in *dst, sin; > struct ip *ip; > struct ifnet *ifp = NULL; > struct pf_addr naddr; > struct pf_src_node *sns[PF_SN_MAX]; > int error = 0; > + unsigned int rtableid; > #ifdef IPSEC > struct m_tag *mtag; > #endif /* IPSEC */ > @@ -5569,27 +5553,25 @@ pf_route(struct mbuf **m, struct pf_rule > > ip = mtod(m0, struct ip *); > > - ro = &iproute; > - bzero((caddr_t)ro, sizeof(*ro)); > - dst = satosin(&ro->ro_dst); > + memset(&sin, 0, sizeof(sin)); > + dst = &sin; > dst->sin_family = AF_INET; > dst->sin_len = sizeof(*dst); > dst->sin_addr = ip->ip_dst; > - ro->ro_tableid = m0->m_pkthdr.ph_rtableid; > + rtableid = m0->m_pkthdr.ph_rtableid; > > if (!r->rt) { > - ro->ro_rt = rtalloc(&ro->ro_dst, RT_REPORT|RT_RESOLVE, > - ro->ro_tableid); > - if (ro->ro_rt == 0) { > + rt = rtalloc(sintosa(dst), RT_REPORT|RT_RESOLVE, rtableid); > + if (rt == NULL) { > ipstat.ips_noroute++; > goto bad; > } > > - ifp = ro->ro_rt->rt_ifp; > - ro->ro_rt->rt_use++; > + ifp = rt->rt_ifp; > + rt->rt_use++; > > - if (ro->ro_rt->rt_flags & RTF_GATEWAY) > - dst = satosin(ro->ro_rt->rt_gateway); > + if (rt->rt_flags & RTF_GATEWAY) > + dst = satosin(rt->rt_gateway); > > m0->m_pkthdr.pf.flags |= PF_TAG_GENERATED; > } else { > @@ -5695,8 +5677,8 @@ pf_route(struct mbuf **m, struct pf_rule > done: > if (r->rt != PF_DUPTO) > *m = NULL; > - if (ro == &iproute && ro->ro_rt) > - rtfree(ro->ro_rt); > + if (rt != NULL) > + rtfree(rt); > return; > > bad: > @@ -5711,13 +5693,12 @@ pf_route6(struct mbuf **m, struct pf_rul > struct pf_state *s) > { > struct mbuf *m0; > - struct route_in6 ip6route; > - struct route_in6 *ro; > - struct sockaddr_in6 *dst; > + struct sockaddr_in6 *dst, sin6; > struct ip6_hdr *ip6; > struct ifnet *ifp = NULL; > struct pf_addr naddr; > struct pf_src_node *sns[PF_SN_MAX]; > + unsigned int rtableid; > > if (m == NULL || *m == NULL || r == NULL || > (dir != PF_IN && dir != PF_OUT) || oifp == NULL) > @@ -5745,13 +5726,12 @@ pf_route6(struct mbuf **m, struct pf_rul > } > ip6 = mtod(m0, struct ip6_hdr *); > > - ro = &ip6route; > - bzero((caddr_t)ro, sizeof(*ro)); > - dst = (struct sockaddr_in6 *)&ro->ro_dst; > + memset(&sin6, 0, sizeof(sin6)); > + dst = &sin6; > dst->sin6_family = AF_INET6; > dst->sin6_len = sizeof(*dst); > dst->sin6_addr = ip6->ip6_dst; > - ro->ro_tableid = m0->m_pkthdr.ph_rtableid; > + rtableid = m0->m_pkthdr.ph_rtableid; > > if (!r->rt) { > m0->m_pkthdr.pf.flags |= PF_TAG_GENERATED; >