Hi,

The IPv6 routing header type 0 check should modify *offp only in
case of an error, so that the genrated icmp6 packet has the correct
pointer.  After successful return, *offp should not be modified.

ok?

bluhm

Index: netinet6/ip6_input.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_input.c,v
retrieving revision 1.250
diff -u -p -r1.250 ip6_input.c
--- netinet6/ip6_input.c        6 Aug 2022 15:57:59 -0000       1.250
+++ netinet6/ip6_input.c        11 Aug 2022 19:36:22 -0000
@@ -695,21 +695,23 @@ ip6_check_rh0hdr(struct mbuf *m, int *of
        do {
                switch (proto) {
                case IPPROTO_ROUTING:
-                       *offp = off;
                        if (rh_cnt++) {
                                /* more than one rh header present */
+                               *offp = off;
                                return (1);
                        }
 
                        if (off + sizeof(rthdr) > lim) {
                                /* packet to short to make sense */
+                               *offp = off;
                                return (1);
                        }
 
                        m_copydata(m, off, sizeof(rthdr), &rthdr);
 
                        if (rthdr.ip6r_type == IPV6_RTHDR_TYPE_0) {
-                               *offp += offsetof(struct ip6_rthdr, ip6r_type);
+                               *offp = off +
+                                   offsetof(struct ip6_rthdr, ip6r_type);
                                return (1);
                        }
 

Reply via email to