Author: rwatson
Date: Thu Mar 11 11:33:04 2010
New Revision: 205010
URL: http://svn.freebsd.org/changeset/base/205010

Log:
  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 nother day.
  
  MFC after:            1 week
  Reviewed by:          bz
  Reviewed and tested by:       rmacklem
  Sponsored by:         Juniper Networks

Modified:
  head/sys/fs/nfsserver/nfs_nfsdport.c

Modified: head/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_nfsdport.c        Thu Mar 11 11:28:29 2010        
(r205009)
+++ head/sys/fs/nfsserver/nfs_nfsdport.c        Thu Mar 11 11:33:04 2010        
(r205010)
@@ -2671,24 +2671,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);
 }
 
 /*
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to