Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/net Fix missing curlwp_bind() for ifa_release(), ok'ed b...



details:   https://anonhg.NetBSD.org/src/rev/d4a94fc8981b
branches:  trunk
changeset: 990056:d4a94fc8981b
user:      knakahara <knakahara%NetBSD.org@localhost>
date:      Mon Oct 25 02:06:29 2021 +0000

description:
Fix missing curlwp_bind() for ifa_release(), ok'ed by yamaguchi@n.o.

This causes the following KASSERT failure in pppoe server.
    - sppp_rcr_event()
      - sppp_ipcp_confreq()
        - sppp_get_ip_addrs()
          - psref_release()

After if_spppsubr.c:1.227, sppp_ipcp_confreq() is done in workqueue
instead of softint.

diffstat:

 sys/net/if_spppsubr.c |  12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)

diffs (68 lines):

diff -r a5e83be73d96 -r d4a94fc8981b sys/net/if_spppsubr.c
--- a/sys/net/if_spppsubr.c     Mon Oct 25 01:06:13 2021 +0000
+++ b/sys/net/if_spppsubr.c     Mon Oct 25 02:06:29 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_spppsubr.c,v 1.259 2021/10/11 05:13:11 knakahara Exp $       */
+/*     $NetBSD: if_spppsubr.c,v 1.260 2021/10/25 02:06:29 knakahara Exp $       */
 
 /*
  * Synchronous PPP/Cisco link level subroutines.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.259 2021/10/11 05:13:11 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.260 2021/10/25 02:06:29 knakahara Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -5591,7 +5591,7 @@
        struct ifaddr *ifa;
        struct sockaddr_in *si, *sm;
        uint32_t ssrc, ddst;
-       int s;
+       int bound, s;
        struct psref psref;
 
        sm = NULL;
@@ -5601,6 +5601,7 @@
         * aliases don't make any sense on a p2p link anyway.
         */
        si = 0;
+       bound = curlwp_bind();
        s = pserialize_read_enter();
        IFADDR_READER_FOREACH(ifa, ifp) {
                if (ifa->ifa_addr->sa_family == AF_INET) {
@@ -5625,6 +5626,7 @@
                        ddst = si->sin_addr.s_addr;
                ifa_release(ifa, &psref);
        }
+       curlwp_bindx(bound);
 
        if (dst) *dst = ntohl(ddst);
        if (src) *src = ntohl(ssrc);
@@ -5783,7 +5785,7 @@
        struct ifaddr *ifa;
        struct sockaddr_in6 *si, *sm;
        struct in6_addr ssrc, ddst;
-       int s;
+       int bound, s;
        struct psref psref;
 
        sm = NULL;
@@ -5794,6 +5796,7 @@
         * aliases don't make any sense on a p2p link anyway.
         */
        si = 0;
+       bound = curlwp_bind();
        s = pserialize_read_enter();
        IFADDR_READER_FOREACH(ifa, ifp) {
                if (ifa->ifa_addr->sa_family == AF_INET6) {
@@ -5821,6 +5824,7 @@
                        memcpy(&ddst, &si->sin6_addr, sizeof(ddst));
                ifa_release(ifa, &psref);
        }
+       curlwp_bindx(bound);
 
        if (dst)
                memcpy(dst, &ddst, sizeof(*dst));



Home | Main Index | Thread Index | Old Index