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:
parent
55be7f3e8d
commit
df9987602f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=82610
@ -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 */
|
||||
|
@ -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); }
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user