diff options
author | hsu <hsu@FreeBSD.org> | 2002-06-14 08:35:21 +0000 |
---|---|---|
committer | hsu <hsu@FreeBSD.org> | 2002-06-14 08:35:21 +0000 |
commit | abda76de0b81d58e1eb0e275c4e384fe97cca491 (patch) | |
tree | 4544f6f0f46695f374bc2a22ee6af0eecc9a671f /sys/netinet6 | |
parent | 0c8a9db6f99a60d7dd69784a1c0e0f6d254fdcc3 (diff) | |
download | FreeBSD-src-abda76de0b81d58e1eb0e275c4e384fe97cca491.zip FreeBSD-src-abda76de0b81d58e1eb0e275c4e384fe97cca491.tar.gz |
Notify functions can destroy the pcb, so they have to return an
indication of whether this happenned so the calling function
knows whether or not to unlock the pcb.
Submitted by: Jennifer Yang (yangjihui@yahoo.com)
Bug reported by: Sid Carter (sidcarter@symonds.net)
Diffstat (limited to 'sys/netinet6')
-rw-r--r-- | sys/netinet6/in6_pcb.c | 5 | ||||
-rw-r--r-- | sys/netinet6/in6_pcb.h | 5 | ||||
-rw-r--r-- | sys/netinet6/raw_ip6.c | 2 | ||||
-rw-r--r-- | sys/netinet6/udp6_usrreq.c | 2 |
4 files changed, 8 insertions, 6 deletions
diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c index f1b92a3..083ed03 100644 --- a/sys/netinet6/in6_pcb.c +++ b/sys/netinet6/in6_pcb.c @@ -768,7 +768,7 @@ in6_pcbnotify(head, dst, fport_arg, src, lport_arg, cmd, notify) const struct sockaddr *src; u_int fport_arg, lport_arg; int cmd; - void (*notify) __P((struct inpcb *, int)); + struct inpcb *(*notify) __P((struct inpcb *, int)); { struct inpcb *inp, *ninp; struct sockaddr_in6 sa6_src, *sa6_dst; @@ -1006,7 +1006,7 @@ in6_losing(in6p) * After a routing change, flush old routing * and allocate a (hopefully) better one. */ -void +struct inpcb * in6_rtchange(inp, errno) struct inpcb *inp; int errno; @@ -1019,6 +1019,7 @@ in6_rtchange(inp, errno) * output is attempted. */ } + return inp; } /* diff --git a/sys/netinet6/in6_pcb.h b/sys/netinet6/in6_pcb.h index 9b0acca..5098a12 100644 --- a/sys/netinet6/in6_pcb.h +++ b/sys/netinet6/in6_pcb.h @@ -92,8 +92,9 @@ struct inpcb * u_int, int, struct ifnet *)); void in6_pcbnotify __P((struct inpcbhead *, struct sockaddr *, u_int, const struct sockaddr *, u_int, int, - void (*)(struct inpcb *, int))); -void in6_rtchange __P((struct inpcb *, int)); + struct inpcb *(*)(struct inpcb *, int))); +struct inpcb * + in6_rtchange __P((struct inpcb *, int)); int in6_setpeeraddr __P((struct socket *so, struct sockaddr **nam)); int in6_setsockaddr __P((struct socket *so, struct sockaddr **nam)); int in6_mapped_sockaddr __P((struct socket *so, struct sockaddr **nam)); diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c index 2dcec0c..c4652af 100644 --- a/sys/netinet6/raw_ip6.c +++ b/sys/netinet6/raw_ip6.c @@ -254,7 +254,7 @@ rip6_ctlinput(cmd, sa, d) int off = 0; struct ip6ctlparam *ip6cp = NULL; const struct sockaddr_in6 *sa6_src = NULL; - void (*notify) __P((struct inpcb *, int)) = in6_rtchange; + struct inpcb *(*notify) __P((struct inpcb *, int)) = in6_rtchange; if (sa->sa_family != AF_INET6 || sa->sa_len != sizeof(struct sockaddr_in6)) diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c index 20913e6..53439d0 100644 --- a/sys/netinet6/udp6_usrreq.c +++ b/sys/netinet6/udp6_usrreq.c @@ -407,7 +407,7 @@ udp6_ctlinput(cmd, sa, d) int off = 0; struct ip6ctlparam *ip6cp = NULL; const struct sockaddr_in6 *sa6_src = NULL; - void (*notify) __P((struct inpcb *, int)) = udp_notify; + struct inpcb *(*notify) __P((struct inpcb *, int)) = udp_notify; struct udp_portonly { u_int16_t uh_sport; u_int16_t uh_dport; |