summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_syscalls.c
diff options
context:
space:
mode:
authorgreen <green@FreeBSD.org>1999-08-04 18:53:50 +0000
committergreen <green@FreeBSD.org>1999-08-04 18:53:50 +0000
commitc03366a55d4ace981b016ae999ae67675c486cdd (patch)
tree12cd9e195ff9e1b516242767963c6e156b837539 /sys/kern/uipc_syscalls.c
parent0ab4dad80912358b49a3cee9e433dbd909334d19 (diff)
downloadFreeBSD-src-c03366a55d4ace981b016ae999ae67675c486cdd.zip
FreeBSD-src-c03366a55d4ace981b016ae999ae67675c486cdd.tar.gz
Fix fd race conditions (during shared fd table usage.) Badfileops is
now used in f_ops in place of NULL, and modifications to the files are more carefully ordered. f_ops should also be set to &badfileops upon "close" of a file. This does not fix other problems mentioned in this PR than the first one. PR: 11629 Reviewed by: peter
Diffstat (limited to 'sys/kern/uipc_syscalls.c')
-rw-r--r--sys/kern/uipc_syscalls.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 6909958..5cf6100 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)uipc_syscalls.c 8.4 (Berkeley) 2/21/94
- * $Id: uipc_syscalls.c,v 1.54 1999/01/25 16:53:53 fenner Exp $
+ * $Id: uipc_syscalls.c,v 1.55 1999/01/27 21:49:57 dillon Exp $
*/
#include "opt_compat.h"
@@ -118,15 +118,15 @@ socket(p, uap)
error = falloc(p, &fp, &fd);
if (error)
return (error);
- fp->f_flag = FREAD|FWRITE;
- fp->f_type = DTYPE_SOCKET;
- fp->f_ops = &socketops;
error = socreate(uap->domain, &so, uap->type, uap->protocol, p);
if (error) {
fdp->fd_ofiles[fd] = 0;
ffree(fp);
} else {
fp->f_data = (caddr_t)so;
+ fp->f_flag = FREAD|FWRITE;
+ fp->f_ops = &socketops;
+ fp->f_type = DTYPE_SOCKET;
p->p_retval[0] = fd;
}
return (error);
@@ -263,10 +263,10 @@ accept1(p, uap, compat)
if (head->so_sigio != NULL)
fsetown(fgetown(head->so_sigio), &so->so_sigio);
- fp->f_type = DTYPE_SOCKET;
+ fp->f_data = (caddr_t)so;
fp->f_flag = fflag;
fp->f_ops = &socketops;
- fp->f_data = (caddr_t)so;
+ fp->f_type = DTYPE_SOCKET;
sa = 0;
(void) soaccept(so, &sa);
if (sa == 0) {
@@ -392,16 +392,10 @@ socketpair(p, uap)
if (error)
goto free2;
sv[0] = fd;
- fp1->f_flag = FREAD|FWRITE;
- fp1->f_type = DTYPE_SOCKET;
- fp1->f_ops = &socketops;
fp1->f_data = (caddr_t)so1;
error = falloc(p, &fp2, &fd);
if (error)
goto free3;
- fp2->f_flag = FREAD|FWRITE;
- fp2->f_type = DTYPE_SOCKET;
- fp2->f_ops = &socketops;
fp2->f_data = (caddr_t)so2;
sv[1] = fd;
error = soconnect2(so1, so2);
@@ -415,14 +409,17 @@ socketpair(p, uap)
if (error)
goto free4;
}
+ fp1->f_flag = fp2->f_flag = FREAD|FWRITE;
+ fp1->f_ops = fp2->f_ops = &socketops;
+ fp1->f_type = fp2->f_type = DTYPE_SOCKET;
error = copyout((caddr_t)sv, (caddr_t)uap->rsv, 2 * sizeof (int));
return (error);
free4:
- ffree(fp2);
fdp->fd_ofiles[sv[1]] = 0;
+ ffree(fp2);
free3:
- ffree(fp1);
fdp->fd_ofiles[sv[0]] = 0;
+ ffree(fp1);
free2:
(void)soclose(so2);
free1:
OpenPOWER on IntegriCloud