svn commit: r205010 - head/sys/fs/nfsserver
Robert Watson
rwatson at FreeBSD.org
Thu Mar 11 11:33:07 UTC 2010
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);
}
/*
More information about the svn-src-all
mailing list