diff options
-rw-r--r-- | sys/netipx/ipx_input.c | 2 | ||||
-rw-r--r-- | sys/netipx/ipx_usrreq.c | 13 |
2 files changed, 12 insertions, 3 deletions
diff --git a/sys/netipx/ipx_input.c b/sys/netipx/ipx_input.c index d0d01a4..ee1ca23 100644 --- a/sys/netipx/ipx_input.c +++ b/sys/netipx/ipx_input.c @@ -95,7 +95,7 @@ struct ipxpcbhead ipxrawpcb_list; static int ipxqmaxlen = IFQ_MAXLEN; static struct ifqueue ipxintrq; -long ipx_pexseq; +long ipx_pexseq; /* Locked with ipxpcb_list_mtx. */ static int ipx_do_route(struct ipx_addr *src, struct route *ro); static void ipx_undo_route(struct route *ro); diff --git a/sys/netipx/ipx_usrreq.c b/sys/netipx/ipx_usrreq.c index dd03614..21e7612 100644 --- a/sys/netipx/ipx_usrreq.c +++ b/sys/netipx/ipx_usrreq.c @@ -325,6 +325,7 @@ ipx_ctloutput(so, sopt) int mask, error, optval; short soptval; struct ipx ioptval; + long seq; error = 0; if (ipxp == NULL) @@ -348,6 +349,7 @@ ipx_ctloutput(so, sopt) case SO_HEADERS_ON_OUTPUT: mask = IPXP_RAWOUT; get_flags: + /* Unlocked read. */ soptval = ipxp->ipxp_flags & mask; error = sooptcopyout(sopt, &soptval, sizeof soptval); break; @@ -356,16 +358,20 @@ ipx_ctloutput(so, sopt) ioptval.ipx_len = 0; ioptval.ipx_sum = 0; ioptval.ipx_tc = 0; + IPX_LOCK(ipxp); ioptval.ipx_pt = ipxp->ipxp_dpt; ioptval.ipx_dna = ipxp->ipxp_faddr; ioptval.ipx_sna = ipxp->ipxp_laddr; + IPX_UNLOCK(ipxp); error = sooptcopyout(sopt, &soptval, sizeof soptval); break; case SO_SEQNO: - error = sooptcopyout(sopt, &ipx_pexseq, - sizeof ipx_pexseq); + IPX_LIST_LOCK(); + seq = ipx_pexseq; ipx_pexseq++; + IPX_LIST_UNLOCK(); + error = sooptcopyout(sopt, &seq, sizeof seq); break; default: @@ -393,10 +399,12 @@ ipx_ctloutput(so, sopt) sizeof optval); if (error) break; + IPX_LOCK(ipxp); if (optval) ipxp->ipxp_flags |= mask; else ipxp->ipxp_flags &= ~mask; + IPX_UNLOCK(ipxp); break; case SO_DEFAULT_HEADERS: @@ -404,6 +412,7 @@ ipx_ctloutput(so, sopt) sizeof ioptval); if (error) break; + /* Unlocked write. */ ipxp->ipxp_dpt = ioptval.ipx_pt; break; #ifdef IPXIP |