Module Name: src Committed By: ozaki-r Date: Tue Oct 3 08:34:28 UTC 2017
Modified Files: src/sys/netipsec: ipsec_output.c key.c key.h Log Message: Fix SP is broken on transport mode isr->saidx was modified accidentally in ipsec_nextisr. Reported by christos@ Helped investigations by christos@ and knakahara@ To generate a diff of this commit: cvs rdiff -u -r1.62 -r1.63 src/sys/netipsec/ipsec_output.c cvs rdiff -u -r1.232 -r1.233 src/sys/netipsec/key.c cvs rdiff -u -r1.30 -r1.31 src/sys/netipsec/key.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netipsec/ipsec_output.c diff -u src/sys/netipsec/ipsec_output.c:1.62 src/sys/netipsec/ipsec_output.c:1.63 --- src/sys/netipsec/ipsec_output.c:1.62 Tue Oct 3 08:25:21 2017 +++ src/sys/netipsec/ipsec_output.c Tue Oct 3 08:34:28 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ipsec_output.c,v 1.62 2017/10/03 08:25:21 ozaki-r Exp $ */ +/* $NetBSD: ipsec_output.c,v 1.63 2017/10/03 08:34:28 ozaki-r Exp $ */ /*- * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ipsec_output.c,v 1.62 2017/10/03 08:25:21 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ipsec_output.c,v 1.63 2017/10/03 08:34:28 ozaki-r Exp $"); /* * IPsec output processing. @@ -386,7 +386,7 @@ do { \ } while (/*CONSTCOND*/0) struct secasvar *sav = NULL; - struct secasindex *saidx; + struct secasindex saidx; IPSEC_SPLASSERT_SOFTNET("ipsec_nextisr"); KASSERTMSG(af == AF_INET || af == AF_INET6, @@ -397,16 +397,16 @@ again: * we only fillin unspecified SA peers for transport * mode; for tunnel mode they must already be filled in. */ - saidx = &isr->saidx; + saidx = isr->saidx; if (isr->saidx.mode == IPSEC_MODE_TRANSPORT) { /* Fillin unspecified SA peers only for transport mode */ - ipsec_fill_saidx_bymbuf(saidx, m, af); + ipsec_fill_saidx_bymbuf(&saidx, m, af); } /* * Lookup SA and validate it. */ - *error = key_checkrequest(isr, &sav); + *error = key_checkrequest(isr, &saidx, &sav); if (*error != 0) { /* * IPsec processing is required, but no SA found. Index: src/sys/netipsec/key.c diff -u src/sys/netipsec/key.c:1.232 src/sys/netipsec/key.c:1.233 --- src/sys/netipsec/key.c:1.232 Tue Oct 3 08:25:21 2017 +++ src/sys/netipsec/key.c Tue Oct 3 08:34:28 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: key.c,v 1.232 2017/10/03 08:25:21 ozaki-r Exp $ */ +/* $NetBSD: key.c,v 1.233 2017/10/03 08:34:28 ozaki-r Exp $ */ /* $FreeBSD: src/sys/netipsec/key.c,v 1.3.2.3 2004/02/14 22:23:23 bms Exp $ */ /* $KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $ */ @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.232 2017/10/03 08:25:21 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.233 2017/10/03 08:34:28 ozaki-r Exp $"); /* * This code is referred to RFC 2367 @@ -995,11 +995,11 @@ done: * ENOENT: policy may be valid, but SA with REQUIRE is on acquiring. */ int -key_checkrequest(struct ipsecrequest *isr, struct secasvar **ret) +key_checkrequest(struct ipsecrequest *isr, const struct secasindex *saidx, + struct secasvar **ret) { u_int level; int error; - const struct secasindex *saidx = &isr->saidx; struct secasvar *sav; KASSERT(isr != NULL); Index: src/sys/netipsec/key.h diff -u src/sys/netipsec/key.h:1.30 src/sys/netipsec/key.h:1.31 --- src/sys/netipsec/key.h:1.30 Tue Oct 3 08:25:21 2017 +++ src/sys/netipsec/key.h Tue Oct 3 08:34:28 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: key.h,v 1.30 2017/10/03 08:25:21 ozaki-r Exp $ */ +/* $NetBSD: key.h,v 1.31 2017/10/03 08:34:28 ozaki-r Exp $ */ /* $FreeBSD: src/sys/netipsec/key.h,v 1.1.4.1 2003/01/24 05:11:36 sam Exp $ */ /* $KAME: key.h,v 1.21 2001/07/27 03:51:30 itojun Exp $ */ @@ -97,7 +97,8 @@ struct secasvar *key_lookup_sa_bysaidx(c key_lookup_sa(dst, proto, spi, sport, dport, __func__, __LINE__) int key_checktunnelsanity (struct secasvar *, u_int, void *, void *); -int key_checkrequest(struct ipsecrequest *, struct secasvar **); +int key_checkrequest(struct ipsecrequest *, const struct secasindex *, + struct secasvar **); struct secpolicy *key_msg2sp (const struct sadb_x_policy *, size_t, int *); struct mbuf *key_sp2msg (const struct secpolicy *);