Module Name: src Committed By: ozaki-r Date: Thu Sep 1 04:27:00 UTC 2016
Modified Files: src/sys/netinet: in.c Log Message: Apply psz/psref to remaining IFADDR_READER_FOREACH Pointed out by ryo@ To generate a diff of this commit: cvs rdiff -u -r1.178 -r1.179 src/sys/netinet/in.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/netinet/in.c diff -u src/sys/netinet/in.c:1.178 src/sys/netinet/in.c:1.179 --- src/sys/netinet/in.c:1.178 Mon Aug 1 03:15:30 2016 +++ src/sys/netinet/in.c Thu Sep 1 04:27:00 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: in.c,v 1.178 2016/08/01 03:15:30 ozaki-r Exp $ */ +/* $NetBSD: in.c,v 1.179 2016/09/01 04:27:00 ozaki-r Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -91,7 +91,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.178 2016/08/01 03:15:30 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.179 2016/09/01 04:27:00 ozaki-r Exp $"); #include "arp.h" @@ -944,7 +944,7 @@ in_lifaddr_ioctl(struct socket *so, u_lo struct in_ifaddr *ia; struct in_addr mask, candidate, match; struct sockaddr_in *sin; - int cmp; + int cmp, s; memset(&mask, 0, sizeof(mask)); memset(&match, 0, sizeof(match)); /* XXX gcc */ @@ -975,6 +975,7 @@ in_lifaddr_ioctl(struct socket *so, u_lo } } + s = pserialize_read_enter(); IFADDR_READER_FOREACH(ifa, ifp) { if (ifa->ifa_addr->sa_family != AF_INET) continue; @@ -985,8 +986,10 @@ in_lifaddr_ioctl(struct socket *so, u_lo if (candidate.s_addr == match.s_addr) break; } - if (ifa == NULL) + if (ifa == NULL) { + pserialize_read_exit(s); return EADDRNOTAVAIL; + } ia = (struct in_ifaddr *)ifa; if (cmd == SIOCGLIFADDR) { @@ -1003,6 +1006,7 @@ in_lifaddr_ioctl(struct socket *so, u_lo in_mask2len(&ia->ia_sockmask.sin_addr); iflr->flags = 0; /*XXX*/ + pserialize_read_exit(s); return 0; } else { @@ -1021,6 +1025,7 @@ in_lifaddr_ioctl(struct socket *so, u_lo } memcpy(&ifra.ifra_dstaddr, &ia->ia_sockmask, ia->ia_sockmask.sin_len); + pserialize_read_exit(s); return in_control(so, SIOCDIFADDR, &ifra, ifp); } @@ -1342,6 +1347,7 @@ in_if_link_up(struct ifnet *ifp) { struct ifaddr *ifa; struct in_ifaddr *ia; + int s, bound; /* Ensure it's sane to run DAD */ if (ifp->if_link_state == LINK_STATE_DOWN) @@ -1349,9 +1355,16 @@ in_if_link_up(struct ifnet *ifp) if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING)) return; + bound = curlwp_bind(); + s = pserialize_read_enter(); IFADDR_READER_FOREACH(ifa, ifp) { + struct psref psref; + if (ifa->ifa_addr->sa_family != AF_INET) continue; + ifa_acquire(ifa, &psref); + pserialize_read_exit(s); + ia = (struct in_ifaddr *)ifa; /* If detached then mark as tentative */ @@ -1368,7 +1381,12 @@ in_if_link_up(struct ifnet *ifp) ia->ia4_flags &= ~IN_IFF_DUPLICATED; ia->ia_dad_start(ifa); } + + s = pserialize_read_enter(); + ifa_release(ifa, &psref); } + pserialize_read_exit(s); + curlwp_bindx(bound); } void @@ -1387,10 +1405,18 @@ in_if_link_down(struct ifnet *ifp) { struct ifaddr *ifa; struct in_ifaddr *ia; + int s, bound; + bound = curlwp_bind(); + s = pserialize_read_enter(); IFADDR_READER_FOREACH(ifa, ifp) { + struct psref psref; + if (ifa->ifa_addr->sa_family != AF_INET) continue; + ifa_acquire(ifa, &psref); + pserialize_read_exit(s); + ia = (struct in_ifaddr *)ifa; /* Stop DAD processing */ @@ -1406,7 +1432,12 @@ in_if_link_down(struct ifnet *ifp) ~(IN_IFF_TENTATIVE | IN_IFF_DUPLICATED); rt_newaddrmsg(RTM_NEWADDR, ifa, 0, NULL); } + + s = pserialize_read_enter(); + ifa_release(ifa, &psref); } + pserialize_read_exit(s); + curlwp_bindx(bound); } void