On 2019/09/19 03:42, abdulbasit wrote:
> Hello,How can i apply the following patch to bsd 6.5 kernel.Kindly share the
> procedure to do this.

If you don't already have it, fetch the -stable source tree
(see "Using CVS to get and update your source trees" on
http://www.openbsd.org/anoncvs.html - you'll want the OPENBSD_6_5 tag).

Change to the relevant directory and paste or pipe the diff into patch(1).

As included in your email the patch has been mangled (it has been
line-wrapped in wrong places) so won't apply directly. But looking at
what you are trying to fix, and seeing that there have been no changes
to the file involved other than the one you want to make, in this
particular case you can use "cvs up -A mpls_output.c" to update to
version of this file from -current.

After patching, here are general-purpose kernel build instructions,
taken from the lines usually included in kernel errata:

    KK=`sysctl -n kern.osversion | cut -d# -f1`
    cd /usr/src/sys/arch/`machine`/compile/$KK
    make obj
    make config
    make
    make install


> 
> Index: mpls_output.c
> ===================================================================
> RCS file: /cvs/src/sys/netmpls/mpls_output.c,v
> retrieving revision 1.26
> diff -u -6 -r1.26 mpls_output.c
> --- mpls_output.c     2 Dec 2015 08:47:00 -0000       1.26
> +++ mpls_output.c     23 Aug 2019 15:02:25 -0000
> @@ -37,13 +37,13 @@
>  
>  #ifdef MPLS_DEBUG
>  #define MPLS_LABEL_GET(l)    ((ntohl((l) & MPLS_LABEL_MASK)) >>
> MPLS_LABEL_OFFSET)
>  #endif
>  
>  void         mpls_do_cksum(struct mbuf *);
> -u_int8_t     mpls_getttl(struct mbuf *, sa_family_t);
> +u_int8_t     mpls_getttl(struct mbuf **, sa_family_t);
>  
>  int
>  mpls_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
>      struct rtentry *rt)
>  {
>       struct sockaddr_mpls    *smpls;
> @@ -67,13 +67,17 @@
>       /* initialize sockaddr_mpls */
>       bzero(&sa_mpls, sizeof(sa_mpls));
>       smpls = &sa_mpls;
>       smpls->smpls_family = AF_MPLS;
>       smpls->smpls_len = sizeof(*smpls);
>  
> -     ttl = mpls_getttl(m, dst->sa_family);
> +     ttl = mpls_getttl(&m, dst->sa_family);
> +     if (m == NULL) {
> +             error = ENOBUFS;
> +             goto bad;
> +     }
>  
>       rt_mpls = (struct rt_mpls *)rt->rt_llinfo;
>       if (rt_mpls == NULL || (rt->rt_flags & RTF_MPLS) == 0) {
>               /* no MPLS information for this entry */
>               if (!ISSET(ifp->if_xflags, IFXF_MPLS)) {
>  #ifdef MPLS_DEBUG
> @@ -157,43 +161,65 @@
>               ip->ip_sum = in_cksum(m, hlen);
>               m->m_pkthdr.csum_flags &= ~M_IPV4_CSUM_OUT;
>       }
>  }
>  
>  u_int8_t
> -mpls_getttl(struct mbuf *m, sa_family_t af)
> +mpls_getttl(struct mbuf **mp, sa_family_t af)
>  {
>       struct shim_hdr *shim;
>       struct ip *ip;
>  #ifdef INET6
>       struct ip6_hdr *ip6hdr;
>  #endif
>       u_int8_t ttl = mpls_defttl;
> +     struct mbuf *m = *mp;
>  
>       /* If the AF is MPLS then inherit the TTL from the present label. */
>       if (af == AF_MPLS) {
> +
> +             m = m_pullup(m, sizeof(*shim));
> +             if (m == NULL) {
> +                     *mp = NULL;
> +                     return 0;
> +             }
> +
>               shim = mtod(m, struct shim_hdr *);
>               ttl = ntohl(shim->shim_label & MPLS_TTL_MASK);
>               return (ttl);
>       }
>       /* Else extract TTL from the encapsualted packet. */
>       switch (*mtod(m, u_char *) >> 4) {
>       case IPVERSION:
>               if (!mpls_mapttl_ip)
>                       break;
>               if (m->m_len < sizeof(*ip))
>                       break;                  /* impossible */
> +
> +             m = m_pullup(m, sizeof(*ip));
> +             if (m == NULL) {
> +                     *mp = NULL;
> +                     return 0;
> +             }
> +
>               ip = mtod(m, struct ip *);
>               ttl = ip->ip_ttl;
>               break;
>  #ifdef INET6
>       case IPV6_VERSION >> 4:
>               if (!mpls_mapttl_ip6)
>                       break;
>               if (m->m_len < sizeof(struct ip6_hdr))
>                       break;                  /* impossible */
> +
> +             m = m_pullup(m, sizeof(*ip6hdr));
> +             if (m == NULL) {
> +                     *mp = NULL;
> +                     return 0;
> +             }
> +
>               ip6hdr = mtod(m, struct ip6_hdr *);
>               ttl = ip6hdr->ip6_hlim;
>               break;
>  #endif
>       default:
>               break;
> 
> 
> 
> 
> --
> Sent from: 
> http://openbsd-archive.7691.n7.nabble.com/openbsd-dev-bugs-f183916.html
> 

Reply via email to