svn commit: r208769 - stable/8/sys/fs/nfsserver

Robert Watson rwatson at FreeBSD.org
Thu Jun 3 09:15:53 UTC 2010


Author: rwatson
Date: Thu Jun  3 09:15:52 2010
New Revision: 208769
URL: http://svn.freebsd.org/changeset/base/208769

Log:
  Merge r205010 from head to stable/8:
  
    Update nfsrv_getsocksndseq() for changes in TCP internals since FreeBSD 6.x:
  
    - so_pcb is now guaranteed to be non-NULL and valid if a valid socket
      reference is held.
  
    - Need to check INP_TIMEWAIT and INP_DROPPED before assuming inp_ppcb is a
      tcpcb, as it might be a tcptw or NULL otherwise.
  
    - tp can never be NULL by the end of the function, so only check
      TCPS_ESTABLISHED before extracting tcpcb fields.
  
    The NFS server arguably incorporates too many assumptions about TCP
    internals, but fixing that is left for another day.
  
    Reviewed by:		bz
    Reviewed and tested by:	rmacklem
    Sponsored by:		Juniper Networks
  
  Approved by:	re (kib)

Modified:
  stable/8/sys/fs/nfsserver/nfs_nfsdport.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)
  stable/8/sys/geom/sched/   (props changed)

Modified: stable/8/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- stable/8/sys/fs/nfsserver/nfs_nfsdport.c	Thu Jun  3 09:06:50 2010	(r208768)
+++ stable/8/sys/fs/nfsserver/nfs_nfsdport.c	Thu Jun  3 09:15:52 2010	(r208769)
@@ -2674,24 +2674,23 @@ nfsrv_getsocksndseq(struct socket *so, t
 {
 	struct inpcb *inp;
 	struct tcpcb *tp;
-	int error = EPIPE;
 
-	INP_INFO_RLOCK(&V_tcbinfo);
 	inp = sotoinpcb(so);
-	if (inp == NULL) {
-		INP_INFO_RUNLOCK(&V_tcbinfo);
-		return (error);
-	}
+	KASSERT(inp != NULL, ("nfsrv_getsocksndseq: inp == NULL"));
 	INP_RLOCK(inp);
-	INP_INFO_RUNLOCK(&V_tcbinfo);
+	if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
+		INP_RUNLOCK(inp);
+		return (EPIPE);
+	}
 	tp = intotcpcb(inp);
-	if (tp != NULL && tp->t_state == TCPS_ESTABLISHED) {
-		*maxp = tp->snd_max;
-		*unap = tp->snd_una;
-		error = 0;
+	if (tp->t_state != TCPS_ESTABLISHED) {
+		INP_RUNLOCK(inp);
+		return (EPIPE);
 	}
+	*maxp = tp->snd_max;
+	*unap = tp->snd_una;
 	INP_RUNLOCK(inp);
-	return (error);
+	return (0);
 }
 
 /*


More information about the svn-src-stable-8 mailing list