Also read-only access to netlock protected data.

Index: sys/netinet/ip_input.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_input.c,v
retrieving revision 1.384
diff -u -p -r1.384 ip_input.c
--- sys/netinet/ip_input.c      16 May 2023 19:36:00 -0000      1.384
+++ sys/netinet/ip_input.c      17 May 2023 10:06:49 -0000
@@ -1719,10 +1719,7 @@ ip_sysctl(int *name, u_int namelen, void
        case IPCTL_MRTVIF:
                if (newp)
                        return (EPERM);
-               NET_LOCK();
-               error = mrt_sysctl_vif(oldp, oldlenp);
-               NET_UNLOCK();
-               return (error);
+               return (mrt_sysctl_vif(oldp, oldlenp));
 #else
        case IPCTL_MRTPROTO:
        case IPCTL_MRTSTATS:
Index: sys/netinet/ip_mroute.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_mroute.c,v
retrieving revision 1.138
diff -u -p -r1.138 ip_mroute.c
--- sys/netinet/ip_mroute.c     19 Apr 2023 20:03:51 -0000      1.138
+++ sys/netinet/ip_mroute.c     17 May 2023 10:06:49 -0000
@@ -356,6 +356,8 @@ mrt_sysctl_vif(void *oldp, size_t *oldle
        given = *oldlenp;
        needed = 0;
        memset(&vinfo, 0, sizeof vinfo);
+
+       NET_LOCK_SHARED();
        TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
                if ((vifp = (struct vif *)ifp->if_mcast) == NULL)
                        continue;
@@ -375,11 +377,15 @@ mrt_sysctl_vif(void *oldp, size_t *oldle
                        int error;
 
                        error = copyout(&vinfo, where, sizeof(vinfo));
-                       if (error)
+                       if (error) {
+                               NET_UNLOCK_SHARED();
                                return (error);
+                       }
                        where += sizeof(vinfo);
                }
        }
+       NET_UNLOCK_SHARED();
+
        if (where) {
                *oldlenp = needed;
                if (given < needed)

Reply via email to