Giant pushdown syscalls in kern/uipc_syscalls.c. Affected calls:

recvmsg(), sendmsg(), recvfrom(), accept(), getpeername(), getsockname(),
socket(), connect(), accept(), send(), recv(), bind(), setsockopt(), listen(),
sendto(), shutdown(), socketpair(), sendfile()
This commit is contained in:
Matthew Dillon 2001-08-31 00:37:34 +00:00
parent 55be7f3e8d
commit df9987602f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=82610
3 changed files with 279 additions and 116 deletions

View File

@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.92 2001/08/30 18:50:56 dillon Exp
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.93 2001/08/31 00:02:18 dillon Exp
*/
#include "opt_compat.h"
@ -49,12 +49,12 @@ struct sysent sysent[] = {
{ SYF_MPSAFE | 0, (sy_call_t *)getuid }, /* 24 = getuid */
{ SYF_MPSAFE | 0, (sy_call_t *)geteuid }, /* 25 = geteuid */
{ AS(ptrace_args), (sy_call_t *)ptrace }, /* 26 = ptrace */
{ AS(recvmsg_args), (sy_call_t *)recvmsg }, /* 27 = recvmsg */
{ AS(sendmsg_args), (sy_call_t *)sendmsg }, /* 28 = sendmsg */
{ AS(recvfrom_args), (sy_call_t *)recvfrom }, /* 29 = recvfrom */
{ AS(accept_args), (sy_call_t *)accept }, /* 30 = accept */
{ AS(getpeername_args), (sy_call_t *)getpeername }, /* 31 = getpeername */
{ AS(getsockname_args), (sy_call_t *)getsockname }, /* 32 = getsockname */
{ SYF_MPSAFE | AS(recvmsg_args), (sy_call_t *)recvmsg }, /* 27 = recvmsg */
{ SYF_MPSAFE | AS(sendmsg_args), (sy_call_t *)sendmsg }, /* 28 = sendmsg */
{ SYF_MPSAFE | AS(recvfrom_args), (sy_call_t *)recvfrom }, /* 29 = recvfrom */
{ SYF_MPSAFE | AS(accept_args), (sy_call_t *)accept }, /* 30 = accept */
{ SYF_MPSAFE | AS(getpeername_args), (sy_call_t *)getpeername }, /* 31 = getpeername */
{ SYF_MPSAFE | AS(getsockname_args), (sy_call_t *)getsockname }, /* 32 = getsockname */
{ AS(access_args), (sy_call_t *)access }, /* 33 = access */
{ AS(chflags_args), (sy_call_t *)chflags }, /* 34 = chflags */
{ AS(fchflags_args), (sy_call_t *)fchflags }, /* 35 = fchflags */
@ -119,35 +119,35 @@ struct sysent sysent[] = {
{ 0, (sy_call_t *)nosys }, /* 94 = setdopt */
{ AS(fsync_args), (sy_call_t *)fsync }, /* 95 = fsync */
{ AS(setpriority_args), (sy_call_t *)setpriority }, /* 96 = setpriority */
{ AS(socket_args), (sy_call_t *)socket }, /* 97 = socket */
{ AS(connect_args), (sy_call_t *)connect }, /* 98 = connect */
{ compat(AS(accept_args),accept) }, /* 99 = old accept */
{ SYF_MPSAFE | AS(socket_args), (sy_call_t *)socket }, /* 97 = socket */
{ SYF_MPSAFE | AS(connect_args), (sy_call_t *)connect }, /* 98 = connect */
{ compat(SYF_MPSAFE | AS(accept_args),accept) }, /* 99 = old accept */
{ AS(getpriority_args), (sy_call_t *)getpriority }, /* 100 = getpriority */
{ compat(AS(osend_args),send) }, /* 101 = old send */
{ compat(AS(orecv_args),recv) }, /* 102 = old recv */
{ compat(SYF_MPSAFE | AS(osend_args),send) }, /* 101 = old send */
{ compat(SYF_MPSAFE | AS(orecv_args),recv) }, /* 102 = old recv */
{ compat(AS(osigreturn_args),sigreturn) }, /* 103 = old sigreturn */
{ AS(bind_args), (sy_call_t *)bind }, /* 104 = bind */
{ AS(setsockopt_args), (sy_call_t *)setsockopt }, /* 105 = setsockopt */
{ AS(listen_args), (sy_call_t *)listen }, /* 106 = listen */
{ SYF_MPSAFE | AS(bind_args), (sy_call_t *)bind }, /* 104 = bind */
{ SYF_MPSAFE | AS(setsockopt_args), (sy_call_t *)setsockopt }, /* 105 = setsockopt */
{ SYF_MPSAFE | AS(listen_args), (sy_call_t *)listen }, /* 106 = listen */
{ 0, (sy_call_t *)nosys }, /* 107 = obsolete vtimes */
{ compat(AS(osigvec_args),sigvec) }, /* 108 = old sigvec */
{ compat(AS(osigblock_args),sigblock) }, /* 109 = old sigblock */
{ compat(AS(osigsetmask_args),sigsetmask) }, /* 110 = old sigsetmask */
{ compat(AS(osigsuspend_args),sigsuspend) }, /* 111 = old sigsuspend */
{ compat(AS(osigstack_args),sigstack) }, /* 112 = old sigstack */
{ compat(AS(orecvmsg_args),recvmsg) }, /* 113 = old recvmsg */
{ compat(AS(osendmsg_args),sendmsg) }, /* 114 = old sendmsg */
{ compat(SYF_MPSAFE | AS(orecvmsg_args),recvmsg) }, /* 113 = old recvmsg */
{ compat(SYF_MPSAFE | AS(osendmsg_args),sendmsg) }, /* 114 = old sendmsg */
{ 0, (sy_call_t *)nosys }, /* 115 = obsolete vtrace */
{ SYF_MPSAFE | AS(gettimeofday_args), (sy_call_t *)gettimeofday }, /* 116 = gettimeofday */
{ AS(getrusage_args), (sy_call_t *)getrusage }, /* 117 = getrusage */
{ AS(getsockopt_args), (sy_call_t *)getsockopt }, /* 118 = getsockopt */
{ SYF_MPSAFE | AS(getsockopt_args), (sy_call_t *)getsockopt }, /* 118 = getsockopt */
{ 0, (sy_call_t *)nosys }, /* 119 = resuba */
{ AS(readv_args), (sy_call_t *)readv }, /* 120 = readv */
{ AS(writev_args), (sy_call_t *)writev }, /* 121 = writev */
{ AS(settimeofday_args), (sy_call_t *)settimeofday }, /* 122 = settimeofday */
{ AS(fchown_args), (sy_call_t *)fchown }, /* 123 = fchown */
{ AS(fchmod_args), (sy_call_t *)fchmod }, /* 124 = fchmod */
{ compat(AS(recvfrom_args),recvfrom) }, /* 125 = old recvfrom */
{ compat(SYF_MPSAFE | AS(recvfrom_args),recvfrom) }, /* 125 = old recvfrom */
{ AS(setreuid_args), (sy_call_t *)setreuid }, /* 126 = setreuid */
{ AS(setregid_args), (sy_call_t *)setregid }, /* 127 = setregid */
{ AS(rename_args), (sy_call_t *)rename }, /* 128 = rename */
@ -155,15 +155,15 @@ struct sysent sysent[] = {
{ compat(AS(oftruncate_args),ftruncate) }, /* 130 = old ftruncate */
{ AS(flock_args), (sy_call_t *)flock }, /* 131 = flock */
{ AS(mkfifo_args), (sy_call_t *)mkfifo }, /* 132 = mkfifo */
{ AS(sendto_args), (sy_call_t *)sendto }, /* 133 = sendto */
{ AS(shutdown_args), (sy_call_t *)shutdown }, /* 134 = shutdown */
{ AS(socketpair_args), (sy_call_t *)socketpair }, /* 135 = socketpair */
{ SYF_MPSAFE | AS(sendto_args), (sy_call_t *)sendto }, /* 133 = sendto */
{ SYF_MPSAFE | AS(shutdown_args), (sy_call_t *)shutdown }, /* 134 = shutdown */
{ SYF_MPSAFE | AS(socketpair_args), (sy_call_t *)socketpair }, /* 135 = socketpair */
{ AS(mkdir_args), (sy_call_t *)mkdir }, /* 136 = mkdir */
{ AS(rmdir_args), (sy_call_t *)rmdir }, /* 137 = rmdir */
{ AS(utimes_args), (sy_call_t *)utimes }, /* 138 = utimes */
{ 0, (sy_call_t *)nosys }, /* 139 = obsolete 4.2 sigreturn */
{ AS(adjtime_args), (sy_call_t *)adjtime }, /* 140 = adjtime */
{ compat(AS(ogetpeername_args),getpeername) }, /* 141 = old getpeername */
{ compat(SYF_MPSAFE | AS(ogetpeername_args),getpeername) }, /* 141 = old getpeername */
{ compat(0,gethostid) }, /* 142 = old gethostid */
{ compat(AS(osethostid_args),sethostid) }, /* 143 = old sethostid */
{ compat(AS(ogetrlimit_args),getrlimit) }, /* 144 = old getrlimit */
@ -172,7 +172,7 @@ struct sysent sysent[] = {
{ 0, (sy_call_t *)setsid }, /* 147 = setsid */
{ AS(quotactl_args), (sy_call_t *)quotactl }, /* 148 = quotactl */
{ compat(0,quota) }, /* 149 = old quota */
{ compat(AS(getsockname_args),getsockname) }, /* 150 = old getsockname */
{ compat(SYF_MPSAFE | AS(getsockname_args),getsockname) }, /* 150 = old getsockname */
{ 0, (sy_call_t *)nosys }, /* 151 = sem_lock */
{ 0, (sy_call_t *)nosys }, /* 152 = sem_wakeup */
{ 0, (sy_call_t *)nosys }, /* 153 = asyncdaemon */
@ -358,7 +358,7 @@ struct sysent sysent[] = {
{ AS(sched_get_priority_min_args), (sy_call_t *)sched_get_priority_min }, /* 333 = sched_get_priority_min */
{ AS(sched_rr_get_interval_args), (sy_call_t *)sched_rr_get_interval }, /* 334 = sched_rr_get_interval */
{ AS(utrace_args), (sy_call_t *)utrace }, /* 335 = utrace */
{ AS(sendfile_args), (sy_call_t *)sendfile }, /* 336 = sendfile */
{ SYF_MPSAFE | AS(sendfile_args), (sy_call_t *)sendfile }, /* 336 = sendfile */
{ AS(kldsym_args), (sy_call_t *)kldsym }, /* 337 = kldsym */
{ AS(jail_args), (sy_call_t *)jail }, /* 338 = jail */
{ 0, (sy_call_t *)nosys }, /* 339 = pioctl */

View File

@ -77,13 +77,13 @@
25 MSTD POSIX { uid_t geteuid(void); }
26 STD BSD { int ptrace(int req, pid_t pid, caddr_t addr, \
int data); }
27 STD BSD { int recvmsg(int s, struct msghdr *msg, int flags); }
28 STD BSD { int sendmsg(int s, caddr_t msg, int flags); }
29 STD BSD { int recvfrom(int s, caddr_t buf, size_t len, \
27 MSTD BSD { int recvmsg(int s, struct msghdr *msg, int flags); }
28 MSTD BSD { int sendmsg(int s, caddr_t msg, int flags); }
29 MSTD BSD { int recvfrom(int s, caddr_t buf, size_t len, \
int flags, caddr_t from, int *fromlenaddr); }
30 STD BSD { int accept(int s, caddr_t name, int *anamelen); }
31 STD BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
32 STD BSD { int getsockname(int fdes, caddr_t asa, int *alen); }
30 MSTD BSD { int accept(int s, caddr_t name, int *anamelen); }
31 MSTD BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
32 MSTD BSD { int getsockname(int fdes, caddr_t asa, int *alen); }
33 STD POSIX { int access(char *path, int flags); }
34 STD BSD { int chflags(char *path, int flags); }
35 STD BSD { int fchflags(int fd, int flags); }
@ -165,18 +165,18 @@
94 UNIMPL BSD setdopt
95 STD POSIX { int fsync(int fd); }
96 STD BSD { int setpriority(int which, int who, int prio); }
97 STD BSD { int socket(int domain, int type, int protocol); }
98 STD BSD { int connect(int s, caddr_t name, int namelen); }
99 CPT_NOA BSD { int accept(int s, caddr_t name, int *anamelen); } \
97 MSTD BSD { int socket(int domain, int type, int protocol); }
98 MSTD BSD { int connect(int s, caddr_t name, int namelen); }
99 MCPT_NOA BSD { int accept(int s, caddr_t name, int *anamelen); } \
accept accept_args int
100 STD BSD { int getpriority(int which, int who); }
101 COMPAT BSD { int send(int s, caddr_t buf, int len, int flags); }
102 COMPAT BSD { int recv(int s, caddr_t buf, int len, int flags); }
101 MCOMPAT BSD { int send(int s, caddr_t buf, int len, int flags); }
102 MCOMPAT BSD { int recv(int s, caddr_t buf, int len, int flags); }
103 COMPAT BSD { int sigreturn(struct osigcontext *sigcntxp); }
104 STD BSD { int bind(int s, caddr_t name, int namelen); }
105 STD BSD { int setsockopt(int s, int level, int name, \
104 MSTD BSD { int bind(int s, caddr_t name, int namelen); }
105 MSTD BSD { int setsockopt(int s, int level, int name, \
caddr_t val, int valsize); }
106 STD BSD { int listen(int s, int backlog); }
106 MSTD BSD { int listen(int s, int backlog); }
107 OBSOL NOHIDE vtimes
108 COMPAT BSD { int sigvec(int signum, struct sigvec *nsv, \
struct sigvec *osv); }
@ -187,13 +187,13 @@
; us the mask, not a pointer to it.
112 COMPAT BSD { int sigstack(struct sigstack *nss, \
struct sigstack *oss); }
113 COMPAT BSD { int recvmsg(int s, struct omsghdr *msg, int flags); }
114 COMPAT BSD { int sendmsg(int s, caddr_t msg, int flags); }
113 MCOMPAT BSD { int recvmsg(int s, struct omsghdr *msg, int flags); }
114 MCOMPAT BSD { int sendmsg(int s, caddr_t msg, int flags); }
115 OBSOL NOHIDE vtrace
116 MSTD BSD { int gettimeofday(struct timeval *tp, \
struct timezone *tzp); }
117 STD BSD { int getrusage(int who, struct rusage *rusage); }
118 STD BSD { int getsockopt(int s, int level, int name, \
118 MSTD BSD { int getsockopt(int s, int level, int name, \
caddr_t val, int *avalsize); }
119 UNIMPL NOHIDE resuba (BSD/OS 2.x)
120 STD BSD { int readv(int fd, struct iovec *iovp, u_int iovcnt); }
@ -203,7 +203,7 @@
struct timezone *tzp); }
123 STD BSD { int fchown(int fd, int uid, int gid); }
124 STD BSD { int fchmod(int fd, int mode); }
125 CPT_NOA BSD { int recvfrom(int s, caddr_t buf, size_t len, \
125 MCPT_NOA BSD { int recvfrom(int s, caddr_t buf, size_t len, \
int flags, caddr_t from, int *fromlenaddr); } \
recvfrom recvfrom_args int
126 STD BSD { int setreuid(int ruid, int euid); }
@ -213,10 +213,10 @@
130 COMPAT BSD { int ftruncate(int fd, long length); }
131 STD BSD { int flock(int fd, int how); }
132 STD POSIX { int mkfifo(char *path, int mode); }
133 STD BSD { int sendto(int s, caddr_t buf, size_t len, \
133 MSTD BSD { int sendto(int s, caddr_t buf, size_t len, \
int flags, caddr_t to, int tolen); }
134 STD BSD { int shutdown(int s, int how); }
135 STD BSD { int socketpair(int domain, int type, int protocol, \
134 MSTD BSD { int shutdown(int s, int how); }
135 MSTD BSD { int socketpair(int domain, int type, int protocol, \
int *rsv); }
136 STD POSIX { int mkdir(char *path, int mode); }
137 STD POSIX { int rmdir(char *path); }
@ -224,7 +224,7 @@
139 OBSOL NOHIDE 4.2 sigreturn
140 STD BSD { int adjtime(struct timeval *delta, \
struct timeval *olddelta); }
141 COMPAT BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
141 MCOMPAT BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
142 COMPAT BSD { long gethostid(void); }
143 COMPAT BSD { int sethostid(long hostid); }
144 COMPAT BSD { int getrlimit(u_int which, struct orlimit *rlp); }
@ -234,7 +234,7 @@
148 STD BSD { int quotactl(char *path, int cmd, int uid, \
caddr_t arg); }
149 COMPAT BSD { int quota(void); }
150 CPT_NOA BSD { int getsockname(int fdec, caddr_t asa, int *alen); }\
150 MCPT_NOA BSD { int getsockname(int fdec, caddr_t asa, int *alen); }\
getsockname getsockname_args int
; Syscalls 151-180 inclusive are reserved for vendor-specific
@ -479,7 +479,7 @@
333 STD POSIX { int sched_get_priority_min (int policy); }
334 STD POSIX { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }
335 STD BSD { int utrace(const void *addr, size_t len); }
336 STD BSD { int sendfile(int fd, int s, off_t offset, size_t nbytes, \
336 MSTD BSD { int sendfile(int fd, int s, off_t offset, size_t nbytes, \
struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
337 STD BSD { int kldsym(int fileid, int cmd, void *data); }
338 STD BSD { int jail(struct jail *jail); }

View File

@ -109,6 +109,9 @@ static u_int sf_buf_alloc_want;
extern struct fileops socketops;
/*
* MPSAFE
*/
int
socket(p, uap)
struct proc *p;
@ -118,14 +121,17 @@ socket(p, uap)
int protocol;
} */ *uap;
{
struct filedesc *fdp = p->p_fd;
struct filedesc *fdp;
struct socket *so;
struct file *fp;
int fd, error;
mtx_lock(&Giant);
fdp = p->p_fd;
error = falloc(p, &fp, &fd);
if (error)
return (error);
goto done2;
fhold(fp);
error = socreate(uap->domain, &so, uap->type, uap->protocol, p);
if (error) {
@ -141,9 +147,14 @@ socket(p, uap)
p->p_retval[0] = fd;
}
fdrop(fp, p);
done2:
mtx_unlock(&Giant);
return (error);
}
/*
* MPSAFE
*/
/* ARGSUSED */
int
bind(p, uap)
@ -158,20 +169,27 @@ bind(p, uap)
struct sockaddr *sa;
int error;
mtx_lock(&Giant);
error = holdsock(p->p_fd, uap->s, &fp);
if (error)
return (error);
goto done2;
error = getsockaddr(&sa, uap->name, uap->namelen);
if (error) {
fdrop(fp, p);
return (error);
goto done2;
}
error = sobind((struct socket *)fp->f_data, sa, p);
FREE(sa, M_SONAME);
fdrop(fp, p);
done2:
mtx_unlock(&Giant);
return (error);
}
/*
* MPSAFE
*/
/* ARGSUSED */
int
listen(p, uap)
@ -184,14 +202,20 @@ listen(p, uap)
struct file *fp;
int error;
mtx_lock(&Giant);
error = holdsock(p->p_fd, uap->s, &fp);
if (error)
return (error);
error = solisten((struct socket *)fp->f_data, uap->backlog, p);
fdrop(fp, p);
if (error == 0) {
error = solisten((struct socket *)fp->f_data, uap->backlog, p);
fdrop(fp, p);
}
mtx_unlock(&Giant);
return(error);
}
/*
* accept1()
* MPSAFE
*/
static int
accept1(p, uap, compat)
struct proc *p;
@ -202,7 +226,7 @@ accept1(p, uap, compat)
} */ *uap;
int compat;
{
struct filedesc *fdp = p->p_fd;
struct filedesc *fdp;
struct file *lfp = NULL;
struct file *nfp = NULL;
struct sockaddr *sa;
@ -211,15 +235,18 @@ accept1(p, uap, compat)
int fd;
short fflag; /* type must match fp->f_flag */
mtx_lock(&Giant);
fdp = p->p_fd;
if (uap->name) {
error = copyin((caddr_t)uap->anamelen, (caddr_t)&namelen,
sizeof (namelen));
if(error)
return (error);
goto done2;
}
error = holdsock(fdp, uap->s, &lfp);
if (error)
return (error);
goto done2;
s = splnet();
head = (struct socket *)lfp->f_data;
if ((head->so_options & SO_ACCEPTCONN) == 0) {
@ -352,29 +379,38 @@ accept1(p, uap, compat)
if (nfp != NULL)
fdrop(nfp, p);
fdrop(lfp, p);
done2:
mtx_unlock(&Giant);
return (error);
}
/*
* MPSAFE (accept1() is MPSAFE)
*/
int
accept(p, uap)
struct proc *p;
struct accept_args *uap;
{
return (accept1(p, uap, 0));
}
#ifdef COMPAT_OLDSOCK
/*
* MPSAFE (accept1() is MPSAFE)
*/
int
oaccept(p, uap)
struct proc *p;
struct accept_args *uap;
{
return (accept1(p, uap, 1));
}
#endif /* COMPAT_OLDSOCK */
/*
* MPSAFE
*/
/* ARGSUSED */
int
connect(p, uap)
@ -390,9 +426,11 @@ connect(p, uap)
struct sockaddr *sa;
int error, s;
mtx_lock(&Giant);
error = holdsock(p->p_fd, uap->s, &fp);
if (error)
return (error);
goto done2;
so = (struct socket *)fp->f_data;
if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
error = EALREADY;
@ -428,9 +466,14 @@ connect(p, uap)
error = EINTR;
done:
fdrop(fp, p);
done2:
mtx_unlock(&Giant);
return (error);
}
/*
* MPSAFE
*/
int
socketpair(p, uap)
struct proc *p;
@ -446,9 +489,11 @@ socketpair(p, uap)
struct socket *so1, *so2;
int fd, error, sv[2];
mtx_lock(&Giant);
error = socreate(uap->domain, &so1, uap->type, uap->protocol, p);
if (error)
return (error);
goto done2;
error = socreate(uap->domain, &so2, uap->type, uap->protocol, p);
if (error)
goto free1;
@ -481,7 +526,7 @@ socketpair(p, uap)
error = copyout((caddr_t)sv, (caddr_t)uap->rsv, 2 * sizeof (int));
fdrop(fp1, p);
fdrop(fp2, p);
return (error);
goto done2;
free4:
if (fdp->fd_ofiles[sv[1]] == fp2) {
fdp->fd_ofiles[sv[1]] = NULL;
@ -498,6 +543,8 @@ socketpair(p, uap)
(void)soclose(so2);
free1:
(void)soclose(so1);
done2:
mtx_unlock(&Giant);
return (error);
}
@ -621,6 +668,9 @@ sendit(p, s, mp, flags)
return (error);
}
/*
* MPSAFE
*/
int
sendto(p, uap)
struct proc *p;
@ -635,6 +685,7 @@ sendto(p, uap)
{
struct msghdr msg;
struct iovec aiov;
int error;
msg.msg_name = uap->to;
msg.msg_namelen = uap->tolen;
@ -646,10 +697,16 @@ sendto(p, uap)
#endif
aiov.iov_base = uap->buf;
aiov.iov_len = uap->len;
return (sendit(p, uap->s, &msg, uap->flags));
mtx_lock(&Giant);
error = sendit(p, uap->s, &msg, uap->flags);
mtx_unlock(&Giant);
return (error);
}
#ifdef COMPAT_OLDSOCK
/*
* MPSAFE
*/
int
osend(p, uap)
struct proc *p;
@ -662,6 +719,7 @@ osend(p, uap)
{
struct msghdr msg;
struct iovec aiov;
int error;
msg.msg_name = 0;
msg.msg_namelen = 0;
@ -671,9 +729,15 @@ osend(p, uap)
aiov.iov_len = uap->len;
msg.msg_control = 0;
msg.msg_flags = 0;
return (sendit(p, uap->s, &msg, uap->flags));
mtx_lock(&Giant);
error = sendit(p, uap->s, &msg, uap->flags);
mtx_unlock(&Giant);
return (error);
}
/*
* MPSAFE
*/
int
osendmsg(p, uap)
struct proc *p;
@ -687,17 +751,21 @@ osendmsg(p, uap)
struct iovec aiov[UIO_SMALLIOV], *iov;
int error;
mtx_lock(&Giant);
error = copyin(uap->msg, (caddr_t)&msg, sizeof (struct omsghdr));
if (error)
return (error);
goto done2;
if ((u_int)msg.msg_iovlen >= UIO_SMALLIOV) {
if ((u_int)msg.msg_iovlen >= UIO_MAXIOV)
return (EMSGSIZE);
if ((u_int)msg.msg_iovlen >= UIO_MAXIOV) {
error = EMSGSIZE;
goto done2;
}
MALLOC(iov, struct iovec *,
sizeof(struct iovec) * (u_int)msg.msg_iovlen, M_IOV,
M_WAITOK);
} else
} else {
iov = aiov;
}
error = copyin((caddr_t)msg.msg_iov, (caddr_t)iov,
(unsigned)(msg.msg_iovlen * sizeof (struct iovec)));
if (error)
@ -708,10 +776,15 @@ osendmsg(p, uap)
done:
if (iov != aiov)
FREE(iov, M_IOV);
done2:
mtx_unlock(&Giant);
return (error);
}
#endif
/*
* MPSAFE
*/
int
sendmsg(p, uap)
struct proc *p;
@ -725,17 +798,22 @@ sendmsg(p, uap)
struct iovec aiov[UIO_SMALLIOV], *iov;
int error;
mtx_lock(&Giant);
error = copyin(uap->msg, (caddr_t)&msg, sizeof (msg));
if (error)
return (error);
goto done2;
if ((u_int)msg.msg_iovlen >= UIO_SMALLIOV) {
if ((u_int)msg.msg_iovlen >= UIO_MAXIOV)
return (EMSGSIZE);
if ((u_int)msg.msg_iovlen >= UIO_MAXIOV) {
error = EMSGSIZE;
goto done2;
}
MALLOC(iov, struct iovec *,
sizeof(struct iovec) * (u_int)msg.msg_iovlen, M_IOV,
M_WAITOK);
} else
} else {
iov = aiov;
}
if (msg.msg_iovlen &&
(error = copyin((caddr_t)msg.msg_iov, (caddr_t)iov,
(unsigned)(msg.msg_iovlen * sizeof (struct iovec)))))
@ -748,6 +826,8 @@ sendmsg(p, uap)
done:
if (iov != aiov)
FREE(iov, M_IOV);
done2:
mtx_unlock(&Giant);
return (error);
}
@ -907,6 +987,9 @@ recvit(p, s, mp, namelenp)
return (error);
}
/*
* MPSAFE
*/
int
recvfrom(p, uap)
struct proc *p;
@ -923,13 +1006,16 @@ recvfrom(p, uap)
struct iovec aiov;
int error;
mtx_lock(&Giant);
if (uap->fromlenaddr) {
error = copyin((caddr_t)uap->fromlenaddr,
(caddr_t)&msg.msg_namelen, sizeof (msg.msg_namelen));
if (error)
return (error);
} else
goto done2;
} else {
msg.msg_namelen = 0;
}
msg.msg_name = uap->from;
msg.msg_iov = &aiov;
msg.msg_iovlen = 1;
@ -937,10 +1023,16 @@ recvfrom(p, uap)
aiov.iov_len = uap->len;
msg.msg_control = 0;
msg.msg_flags = uap->flags;
return (recvit(p, uap->s, &msg, (caddr_t)uap->fromlenaddr));
error = recvit(p, uap->s, &msg, (caddr_t)uap->fromlenaddr);
done2:
mtx_unlock(&Giant);
return(error);
}
#ifdef COMPAT_OLDSOCK
/*
* MPSAFE
*/
int
orecvfrom(p, uap)
struct proc *p;
@ -954,6 +1046,9 @@ orecvfrom(p, uap)
#ifdef COMPAT_OLDSOCK
/*
* MPSAFE
*/
int
orecv(p, uap)
struct proc *p;
@ -966,7 +1061,9 @@ orecv(p, uap)
{
struct msghdr msg;
struct iovec aiov;
int error;
mtx_lock(&Giant);
msg.msg_name = 0;
msg.msg_namelen = 0;
msg.msg_iov = &aiov;
@ -975,13 +1072,17 @@ orecv(p, uap)
aiov.iov_len = uap->len;
msg.msg_control = 0;
msg.msg_flags = uap->flags;
return (recvit(p, uap->s, &msg, (caddr_t)0));
error = recvit(p, uap->s, &msg, (caddr_t)0);
mtx_unlock(&Giant);
return (error);
}
/*
* Old recvmsg. This code takes advantage of the fact that the old msghdr
* overlays the new one, missing only the flags, and with the (old) access
* rights where the control fields are now.
*
* MPSAFE
*/
int
orecvmsg(p, uap)
@ -1000,14 +1101,19 @@ orecvmsg(p, uap)
sizeof (struct omsghdr));
if (error)
return (error);
mtx_lock(&Giant);
if ((u_int)msg.msg_iovlen >= UIO_SMALLIOV) {
if ((u_int)msg.msg_iovlen >= UIO_MAXIOV)
return (EMSGSIZE);
if ((u_int)msg.msg_iovlen >= UIO_MAXIOV) {
error = EMSGSIZE;
goto done2;
}
MALLOC(iov, struct iovec *,
sizeof(struct iovec) * (u_int)msg.msg_iovlen, M_IOV,
M_WAITOK);
} else
} else {
iov = aiov;
}
msg.msg_flags = uap->flags | MSG_COMPAT;
error = copyin((caddr_t)msg.msg_iov, (caddr_t)iov,
(unsigned)(msg.msg_iovlen * sizeof (struct iovec)));
@ -1022,10 +1128,15 @@ orecvmsg(p, uap)
done:
if (iov != aiov)
FREE(iov, M_IOV);
done2:
mtx_unlock(&Giant);
return (error);
}
#endif
/*
* MPSAFE
*/
int
recvmsg(p, uap)
struct proc *p;
@ -1039,17 +1150,22 @@ recvmsg(p, uap)
struct iovec aiov[UIO_SMALLIOV], *uiov, *iov;
register int error;
mtx_lock(&Giant);
error = copyin((caddr_t)uap->msg, (caddr_t)&msg, sizeof (msg));
if (error)
return (error);
goto done2;
if ((u_int)msg.msg_iovlen >= UIO_SMALLIOV) {
if ((u_int)msg.msg_iovlen >= UIO_MAXIOV)
return (EMSGSIZE);
if ((u_int)msg.msg_iovlen >= UIO_MAXIOV) {
error = EMSGSIZE;
goto done2;
}
MALLOC(iov, struct iovec *,
sizeof(struct iovec) * (u_int)msg.msg_iovlen, M_IOV,
M_WAITOK);
} else
} else {
iov = aiov;
}
#ifdef COMPAT_OLDSOCK
msg.msg_flags = uap->flags &~ MSG_COMPAT;
#else
@ -1069,9 +1185,14 @@ recvmsg(p, uap)
done:
if (iov != aiov)
FREE(iov, M_IOV);
done2:
mtx_unlock(&Giant);
return (error);
}
/*
* MPSAFE
*/
/* ARGSUSED */
int
shutdown(p, uap)
@ -1084,14 +1205,20 @@ shutdown(p, uap)
struct file *fp;
int error;
mtx_lock(&Giant);
error = holdsock(p->p_fd, uap->s, &fp);
if (error)
return (error);
error = soshutdown((struct socket *)fp->f_data, uap->how);
fdrop(fp, p);
if (error == 0) {
error = soshutdown((struct socket *)fp->f_data, uap->how);
fdrop(fp, p);
}
mtx_unlock(&Giant);
return(error);
}
/*
* MPSAFE
*/
/* ARGSUSED */
int
setsockopt(p, uap)
@ -1113,21 +1240,25 @@ setsockopt(p, uap)
if (uap->valsize < 0)
return (EINVAL);
mtx_lock(&Giant);
error = holdsock(p->p_fd, uap->s, &fp);
if (error)
return (error);
sopt.sopt_dir = SOPT_SET;
sopt.sopt_level = uap->level;
sopt.sopt_name = uap->name;
sopt.sopt_val = uap->val;
sopt.sopt_valsize = uap->valsize;
sopt.sopt_p = p;
error = sosetopt((struct socket *)fp->f_data, &sopt);
fdrop(fp, p);
if (error == 0) {
sopt.sopt_dir = SOPT_SET;
sopt.sopt_level = uap->level;
sopt.sopt_name = uap->name;
sopt.sopt_val = uap->val;
sopt.sopt_valsize = uap->valsize;
sopt.sopt_p = p;
error = sosetopt((struct socket *)fp->f_data, &sopt);
fdrop(fp, p);
}
mtx_unlock(&Giant);
return(error);
}
/*
* MPSAFE
*/
/* ARGSUSED */
int
getsockopt(p, uap)
@ -1144,19 +1275,22 @@ getsockopt(p, uap)
struct file *fp;
struct sockopt sopt;
mtx_lock(&Giant);
error = holdsock(p->p_fd, uap->s, &fp);
if (error)
return (error);
goto done2;
if (uap->val) {
error = copyin((caddr_t)uap->avalsize, (caddr_t)&valsize,
sizeof (valsize));
if (error) {
fdrop(fp, p);
return (error);
goto done2;
}
if (valsize < 0) {
fdrop(fp, p);
return (EINVAL);
error = EINVAL;
goto done2;
}
} else {
valsize = 0;
@ -1176,11 +1310,15 @@ getsockopt(p, uap)
(caddr_t)uap->avalsize, sizeof (valsize));
}
fdrop(fp, p);
done2:
mtx_unlock(&Giant);
return (error);
}
/*
* Get socket name.
* getsockname1() - Get socket name.
*
* MPSAFE
*/
/* ARGSUSED */
static int
@ -1198,13 +1336,15 @@ getsockname1(p, uap, compat)
struct sockaddr *sa;
int len, error;
mtx_lock(&Giant);
error = holdsock(p->p_fd, uap->fdes, &fp);
if (error)
return (error);
goto done2;
error = copyin((caddr_t)uap->alen, (caddr_t)&len, sizeof (len));
if (error) {
fdrop(fp, p);
return (error);
goto done2;
}
so = (struct socket *)fp->f_data;
sa = 0;
@ -1230,31 +1370,39 @@ getsockname1(p, uap, compat)
if (sa)
FREE(sa, M_SONAME);
fdrop(fp, p);
done2:
mtx_unlock(&Giant);
return (error);
}
/*
* MPSAFE
*/
int
getsockname(p, uap)
struct proc *p;
struct getsockname_args *uap;
{
return (getsockname1(p, uap, 0));
}
#ifdef COMPAT_OLDSOCK
/*
* MPSAFE
*/
int
ogetsockname(p, uap)
struct proc *p;
struct getsockname_args *uap;
{
return (getsockname1(p, uap, 1));
}
#endif /* COMPAT_OLDSOCK */
/*
* Get name of peer for connected socket.
* getpeername1() - Get name of peer for connected socket.
*
* MPSAFE
*/
/* ARGSUSED */
static int
@ -1272,18 +1420,21 @@ getpeername1(p, uap, compat)
struct sockaddr *sa;
int len, error;
mtx_lock(&Giant);
error = holdsock(p->p_fd, uap->fdes, &fp);
if (error)
return (error);
goto done2;
so = (struct socket *)fp->f_data;
if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0) {
fdrop(fp, p);
return (ENOTCONN);
error = ENOTCONN;
goto done2;
}
error = copyin((caddr_t)uap->alen, (caddr_t)&len, sizeof (len));
if (error) {
fdrop(fp, p);
return (error);
goto done2;
}
sa = 0;
error = (*so->so_proto->pr_usrreqs->pru_peeraddr)(so, &sa);
@ -1308,25 +1459,31 @@ getpeername1(p, uap, compat)
if (sa)
FREE(sa, M_SONAME);
fdrop(fp, p);
done2:
mtx_unlock(&Giant);
return (error);
}
/*
* MPSAFE
*/
int
getpeername(p, uap)
struct proc *p;
struct getpeername_args *uap;
{
return (getpeername1(p, uap, 0));
}
#ifdef COMPAT_OLDSOCK
/*
* MPSAFE
*/
int
ogetpeername(p, uap)
struct proc *p;
struct ogetpeername_args *uap;
{
/* XXX uap should have type `getpeername_args *' to begin with. */
return (getpeername1(p, (struct getpeername_args *)uap, 1));
}
@ -1512,6 +1669,9 @@ sf_buf_free(caddr_t addr, void *args)
/*
* sendfile(2)
*
* MPSAFE
*
* int sendfile(int fd, int s, off_t offset, size_t nbytes,
* struct sf_hdtr *hdtr, off_t *sbytes, int flags)
*
@ -1519,6 +1679,7 @@ sf_buf_free(caddr_t addr, void *args)
* specified by 's'. Send only 'nbytes' of the file or until EOF if
* nbytes == 0. Optionally add a header and/or trailer to the socket
* output. If specified, write the total number of bytes sent into *sbytes.
*
*/
int
sendfile(struct proc *p, struct sendfile_args *uap)
@ -1536,7 +1697,7 @@ sendfile(struct proc *p, struct sendfile_args *uap)
off_t off, xfsize, sbytes = 0;
int error = 0, s;
GIANT_REQUIRED;
mtx_lock(&Giant);
vp = NULL;
/*
@ -1848,5 +2009,7 @@ sendfile(struct proc *p, struct sendfile_args *uap)
vrele(vp);
if (fp)
fdrop(fp, p);
mtx_unlock(&Giant);
return (error);
}