From 0e1eebb84659003b5f251ff30acd8d2cef49759c Mon Sep 17 00:00:00 2001 From: Don Lewis Date: Thu, 11 Jul 2002 23:18:43 +0000 Subject: [PATCH] Defer calling SYSCTL_OUT() until after the locks have been released. --- sys/netinet/tcp_subr.c | 6 ++++-- sys/netinet/tcp_timewait.c | 6 ++++-- sys/netinet/udp_usrreq.c | 3 ++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index 07deac9a519..9dab996e9a5 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -941,12 +941,13 @@ tcp_getcred(SYSCTL_HANDLER_ARGS) if (error) goto out; cru2x(inp->inp_socket->so_cred, &xuc); - error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred)); out: INP_UNLOCK(inp); outunlocked: INP_INFO_RUNLOCK(&tcbinfo); splx(s); + if (error == 0) + error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred)); return (error); } @@ -1002,12 +1003,13 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS) if (error) goto out; cru2x(inp->inp_socket->so_cred, &xuc); - error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred)); out: INP_UNLOCK(inp); outunlocked: INP_INFO_RUNLOCK(&tcbinfo); splx(s); + if (error == 0) + error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred)); return (error); } diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c index 07deac9a519..9dab996e9a5 100644 --- a/sys/netinet/tcp_timewait.c +++ b/sys/netinet/tcp_timewait.c @@ -941,12 +941,13 @@ tcp_getcred(SYSCTL_HANDLER_ARGS) if (error) goto out; cru2x(inp->inp_socket->so_cred, &xuc); - error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred)); out: INP_UNLOCK(inp); outunlocked: INP_INFO_RUNLOCK(&tcbinfo); splx(s); + if (error == 0) + error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred)); return (error); } @@ -1002,12 +1003,13 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS) if (error) goto out; cru2x(inp->inp_socket->so_cred, &xuc); - error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred)); out: INP_UNLOCK(inp); outunlocked: INP_INFO_RUNLOCK(&tcbinfo); splx(s); + if (error == 0) + error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred)); return (error); } diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 31fb2513395..56bb1e1310b 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -689,10 +689,11 @@ udp_getcred(SYSCTL_HANDLER_ARGS) if (error) goto out; cru2x(inp->inp_socket->so_cred, &xuc); - error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred)); out: INP_INFO_RUNLOCK(&udbinfo); splx(s); + if (error == 0) + error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred)); return (error); }