Module Name: src Committed By: knakahara Date: Thu Oct 19 11:28:30 UTC 2017
Modified Files: src/sys/net: if_l2tp.c Log Message: fix l2tp panic when l2tp session id is changed (same as if_vlan.c:r1.104) E.g. the following operation causes this panic. ==================== # ifconfig l2tp0 create # ifconfig l2tp0 session 140 140 # ifconfig l2tp1 create # ifconfig l2tp1 session 200 200 # ifconfig l2tp1 session 300 300 panic: kernel diagnostic assertion "new->ple_next == NULL" failed: file "/disk4/home/k-nakahara/repos/netbsd-src/sys/sys/pslist.h", line 118 ==================== Pointed out by s-yamaguchi@IIJ, thanks. XXX need pullup-8 To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/net/if_l2tp.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/if_l2tp.c diff -u src/sys/net/if_l2tp.c:1.11 src/sys/net/if_l2tp.c:1.12 --- src/sys/net/if_l2tp.c:1.11 Thu Jun 1 02:45:14 2017 +++ src/sys/net/if_l2tp.c Thu Oct 19 11:28:30 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_l2tp.c,v 1.11 2017/06/01 02:45:14 chs Exp $ */ +/* $NetBSD: if_l2tp.c,v 1.12 2017/10/19 11:28:30 knakahara Exp $ */ /* * Copyright (c) 2017 Internet Initiative Japan Inc. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_l2tp.c,v 1.11 2017/06/01 02:45:14 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_l2tp.c,v 1.12 2017/10/19 11:28:30 knakahara Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -1069,6 +1069,7 @@ l2tp_set_session(struct l2tp_softc *sc, pserialize_perform(l2tp_psz); } mutex_exit(&l2tp_hash.lock); + PSLIST_ENTRY_DESTROY(sc, l2tp_hash); l2tp_variant_update(sc, nvar); mutex_exit(&sc->l2tp_lock); @@ -1078,6 +1079,7 @@ l2tp_set_session(struct l2tp_softc *sc, log(LOG_DEBUG, "%s: add hash entry: sess_id=%" PRIu32 ", idx=%" PRIu32 "\n", sc->l2tp_ec.ec_if.if_xname, nvar->lv_my_sess_id, idx); + PSLIST_ENTRY_INIT(sc, l2tp_hash); mutex_enter(&l2tp_hash.lock); PSLIST_WRITER_INSERT_HEAD(&l2tp_hash.lists[idx], sc, l2tp_hash); mutex_exit(&l2tp_hash.lock);