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