summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_syscalls.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2007-04-02 19:15:47 +0000
committerjhb <jhb@FreeBSD.org>2007-04-02 19:15:47 +0000
commitb9a3a5afc72f64c5b84111d7076a3e50d67b2529 (patch)
treeb4ed199cdf22428e589ba76f6d3c83161e6890e7 /sys/kern/uipc_syscalls.c
parent67ec796ffc0def827d19857a83e77651a34b9f96 (diff)
downloadFreeBSD-src-b9a3a5afc72f64c5b84111d7076a3e50d67b2529.zip
FreeBSD-src-b9a3a5afc72f64c5b84111d7076a3e50d67b2529.tar.gz
Fix a fd leak in socketpair():
- Close the new file objects created during socketpair() if the copyout of the new file descriptors fails. - Add a test to the socketpair regression test for this edge case.
Diffstat (limited to 'sys/kern/uipc_syscalls.c')
-rw-r--r--sys/kern/uipc_syscalls.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 5f6479c..fd2a208 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -664,7 +664,10 @@ socketpair(td, uap)
fp2->f_ops = &socketops;
fp2->f_type = DTYPE_SOCKET;
FILE_UNLOCK(fp2);
+ so1 = so2 = NULL;
error = copyout(sv, uap->rsv, 2 * sizeof (int));
+ if (error)
+ goto free4;
fdrop(fp1, td);
fdrop(fp2, td);
goto done2;
@@ -675,9 +678,11 @@ free3:
fdclose(fdp, fp1, sv[0], td);
fdrop(fp1, td);
free2:
- (void)soclose(so2);
+ if (so2 != NULL)
+ (void)soclose(so2);
free1:
- (void)soclose(so1);
+ if (so1 != NULL)
+ (void)soclose(so1);
done2:
NET_UNLOCK_GIANT();
return (error);
OpenPOWER on IntegriCloud