1 /*-
2  * Copyright (c) 1982, 1986, 1989, 1990, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * sendfile(2) and related extensions:
6  * Copyright (c) 1998, David Greenman. All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 4. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  *	@(#)uipc_syscalls.c	8.4 (Berkeley) 2/21/94
33  */
34 
35 #include <sys/cdefs.h>
36 __FBSDID("$FreeBSD: stable/9/sys/kern/uipc_syscalls.c 255443 2013-09-10 10:07:21Z des $");
37 
38 #include "opt_capsicum.h"
39 #include "opt_inet.h"
40 #include "opt_inet6.h"
41 #include "opt_sctp.h"
42 #include "opt_compat.h"
43 #include "opt_ktrace.h"
44 
45 #include <sys/param.h>
46 #include <sys/systm.h>
47 #include <sys/capability.h>
48 #include <sys/kernel.h>
49 #include <sys/lock.h>
50 #include <sys/mutex.h>
51 #include <sys/sysproto.h>
52 #include <sys/malloc.h>
53 #include <sys/filedesc.h>
54 #include <sys/event.h>
55 #include <sys/proc.h>
56 #include <sys/fcntl.h>
57 #include <sys/file.h>
58 #include <sys/filio.h>
59 #include <sys/jail.h>
60 #include <sys/mount.h>
61 #include <sys/mbuf.h>
62 #include <sys/protosw.h>
63 #include <sys/sf_buf.h>
64 #include <sys/sysent.h>
65 #include <sys/socket.h>
66 #include <sys/socketvar.h>
67 #include <sys/signalvar.h>
68 #include <sys/syscallsubr.h>
69 #include <sys/sysctl.h>
70 #include <sys/uio.h>
71 #include <sys/vnode.h>
72 #ifdef KTRACE
73 #include <sys/ktrace.h>
74 #endif
75 #ifdef COMPAT_FREEBSD32
76 #include <compat/freebsd32/freebsd32_util.h>
77 #endif
78 
79 #include <net/vnet.h>
80 
81 #include <security/audit/audit.h>
82 #include <security/mac/mac_framework.h>
83 
84 #include <vm/vm.h>
85 #include <vm/vm_param.h>
86 #include <vm/vm_object.h>
87 #include <vm/vm_page.h>
88 #include <vm/vm_pageout.h>
89 #include <vm/vm_kern.h>
90 #include <vm/vm_extern.h>
91 
92 #if defined(INET) || defined(INET6)
93 #ifdef SCTP
94 #include <netinet/sctp.h>
95 #include <netinet/sctp_peeloff.h>
96 #endif /* SCTP */
97 #endif /* INET || INET6 */
98 
99 /*
100  * Creation flags, OR'ed into socket() and socketpair() type argument.
101  * For stable/9, these are supported but not exposed in the header file.
102  */
103 #define	SOCK_CLOEXEC	0x10000000
104 #define	SOCK_NONBLOCK	0x20000000
105 
106 static int sendit(struct thread *td, int s, struct msghdr *mp, int flags);
107 static int recvit(struct thread *td, int s, struct msghdr *mp, void *namelenp);
108 
109 static int accept1(struct thread *td, struct accept_args *uap, int compat);
110 static int do_sendfile(struct thread *td, struct sendfile_args *uap, int compat);
111 static int getsockname1(struct thread *td, struct getsockname_args *uap,
112 			int compat);
113 static int getpeername1(struct thread *td, struct getpeername_args *uap,
114 			int compat);
115 
116 /*
117  * NSFBUFS-related variables and associated sysctls
118  */
119 int nsfbufs;
120 int nsfbufspeak;
121 int nsfbufsused;
122 
123 SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufs, CTLFLAG_RDTUN, &nsfbufs, 0,
124     "Maximum number of sendfile(2) sf_bufs available");
125 SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufspeak, CTLFLAG_RD, &nsfbufspeak, 0,
126     "Number of sendfile(2) sf_bufs at peak usage");
127 SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufsused, CTLFLAG_RD, &nsfbufsused, 0,
128     "Number of sendfile(2) sf_bufs in use");
129 
130 /*
131  * Convert a user file descriptor to a kernel file entry and check that, if
132  * it is a capability, the right rights are present. A reference on the file
133  * entry is held upon returning.
134  */
135 static int
getsock_cap(struct filedesc * fdp,int fd,cap_rights_t rights,struct file ** fpp,u_int * fflagp)136 getsock_cap(struct filedesc *fdp, int fd, cap_rights_t rights,
137     struct file **fpp, u_int *fflagp)
138 {
139 	struct file *fp;
140 #ifdef CAPABILITIES
141 	struct file *fp_fromcap;
142 	int error;
143 #endif
144 
145 	fp = NULL;
146 	if ((fdp == NULL) || ((fp = fget_unlocked(fdp, fd)) == NULL))
147 		return (EBADF);
148 #ifdef CAPABILITIES
149 	/*
150 	 * If the file descriptor is for a capability, test rights and use
151 	 * the file descriptor referenced by the capability.
152 	 */
153 	error = cap_funwrap(fp, rights, &fp_fromcap);
154 	if (error) {
155 		fdrop(fp, curthread);
156 		return (error);
157 	}
158 	if (fp != fp_fromcap) {
159 		fhold(fp_fromcap);
160 		fdrop(fp, curthread);
161 		fp = fp_fromcap;
162 	}
163 #endif /* CAPABILITIES */
164 	if (fp->f_type != DTYPE_SOCKET) {
165 		fdrop(fp, curthread);
166 		return (ENOTSOCK);
167 	}
168 	if (fflagp != NULL)
169 		*fflagp = fp->f_flag;
170 	*fpp = fp;
171 	return (0);
172 }
173 
174 /*
175  * System call interface to the socket abstraction.
176  */
177 #if defined(COMPAT_43)
178 #define COMPAT_OLDSOCK
179 #endif
180 
181 int
sys_socket(td,uap)182 sys_socket(td, uap)
183 	struct thread *td;
184 	struct socket_args /* {
185 		int	domain;
186 		int	type;
187 		int	protocol;
188 	} */ *uap;
189 {
190 	struct filedesc *fdp;
191 	struct socket *so;
192 	struct file *fp;
193 	int fd, error, type, oflag, fflag;
194 
195 	AUDIT_ARG_SOCKET(uap->domain, uap->type, uap->protocol);
196 
197 	type = uap->type;
198 	oflag = 0;
199 	fflag = 0;
200 	if ((type & SOCK_CLOEXEC) != 0) {
201 		type &= ~SOCK_CLOEXEC;
202 		oflag |= O_CLOEXEC;
203 	}
204 	if ((type & SOCK_NONBLOCK) != 0) {
205 		type &= ~SOCK_NONBLOCK;
206 		fflag |= FNONBLOCK;
207 	}
208 
209 #ifdef MAC
210 	error = mac_socket_check_create(td->td_ucred, uap->domain, type,
211 	    uap->protocol);
212 	if (error)
213 		return (error);
214 #endif
215 	fdp = td->td_proc->p_fd;
216 	error = falloc(td, &fp, &fd, oflag);
217 	if (error)
218 		return (error);
219 	/* An extra reference on `fp' has been held for us by falloc(). */
220 	error = socreate(uap->domain, &so, type, uap->protocol,
221 	    td->td_ucred, td);
222 	if (error) {
223 		fdclose(fdp, fp, fd, td);
224 	} else {
225 		finit(fp, FREAD | FWRITE | fflag, DTYPE_SOCKET, so, &socketops);
226 		if ((fflag & FNONBLOCK) != 0)
227 			(void) fo_ioctl(fp, FIONBIO, &fflag, td->td_ucred, td);
228 		td->td_retval[0] = fd;
229 	}
230 	fdrop(fp, td);
231 	return (error);
232 }
233 
234 /* ARGSUSED */
235 int
sys_bind(td,uap)236 sys_bind(td, uap)
237 	struct thread *td;
238 	struct bind_args /* {
239 		int	s;
240 		caddr_t	name;
241 		int	namelen;
242 	} */ *uap;
243 {
244 	struct sockaddr *sa;
245 	int error;
246 
247 	if ((error = getsockaddr(&sa, uap->name, uap->namelen)) != 0)
248 		return (error);
249 
250 	error = kern_bind(td, uap->s, sa);
251 	free(sa, M_SONAME);
252 	return (error);
253 }
254 
255 int
kern_bind(td,fd,sa)256 kern_bind(td, fd, sa)
257 	struct thread *td;
258 	int fd;
259 	struct sockaddr *sa;
260 {
261 	struct socket *so;
262 	struct file *fp;
263 	int error;
264 
265 	AUDIT_ARG_FD(fd);
266 	error = getsock_cap(td->td_proc->p_fd, fd, CAP_BIND, &fp, NULL);
267 	if (error)
268 		return (error);
269 	so = fp->f_data;
270 #ifdef KTRACE
271 	if (KTRPOINT(td, KTR_STRUCT))
272 		ktrsockaddr(sa);
273 #endif
274 #ifdef MAC
275 	error = mac_socket_check_bind(td->td_ucred, so, sa);
276 	if (error == 0)
277 #endif
278 		error = sobind(so, sa, td);
279 	fdrop(fp, td);
280 	return (error);
281 }
282 
283 /* ARGSUSED */
284 int
sys_listen(td,uap)285 sys_listen(td, uap)
286 	struct thread *td;
287 	struct listen_args /* {
288 		int	s;
289 		int	backlog;
290 	} */ *uap;
291 {
292 	struct socket *so;
293 	struct file *fp;
294 	int error;
295 
296 	AUDIT_ARG_FD(uap->s);
297 	error = getsock_cap(td->td_proc->p_fd, uap->s, CAP_LISTEN, &fp, NULL);
298 	if (error == 0) {
299 		so = fp->f_data;
300 #ifdef MAC
301 		error = mac_socket_check_listen(td->td_ucred, so);
302 		if (error == 0)
303 #endif
304 			error = solisten(so, uap->backlog, td);
305 		fdrop(fp, td);
306 	}
307 	return(error);
308 }
309 
310 /*
311  * accept1()
312  */
313 static int
accept1(td,uap,compat)314 accept1(td, uap, compat)
315 	struct thread *td;
316 	struct accept_args /* {
317 		int	s;
318 		struct sockaddr	* __restrict name;
319 		socklen_t	* __restrict anamelen;
320 	} */ *uap;
321 	int compat;
322 {
323 	struct sockaddr *name;
324 	socklen_t namelen;
325 	struct file *fp;
326 	int error;
327 
328 	if (uap->name == NULL)
329 		return (kern_accept(td, uap->s, NULL, NULL, NULL));
330 
331 	error = copyin(uap->anamelen, &namelen, sizeof (namelen));
332 	if (error)
333 		return (error);
334 
335 	error = kern_accept(td, uap->s, &name, &namelen, &fp);
336 
337 	/*
338 	 * return a namelen of zero for older code which might
339 	 * ignore the return value from accept.
340 	 */
341 	if (error) {
342 		(void) copyout(&namelen,
343 		    uap->anamelen, sizeof(*uap->anamelen));
344 		return (error);
345 	}
346 
347 	if (error == 0 && name != NULL) {
348 #ifdef COMPAT_OLDSOCK
349 		if (compat)
350 			((struct osockaddr *)name)->sa_family =
351 			    name->sa_family;
352 #endif
353 		error = copyout(name, uap->name, namelen);
354 	}
355 	if (error == 0)
356 		error = copyout(&namelen, uap->anamelen,
357 		    sizeof(namelen));
358 	if (error)
359 		fdclose(td->td_proc->p_fd, fp, td->td_retval[0], td);
360 	fdrop(fp, td);
361 	free(name, M_SONAME);
362 	return (error);
363 }
364 
365 int
kern_accept(struct thread * td,int s,struct sockaddr ** name,socklen_t * namelen,struct file ** fp)366 kern_accept(struct thread *td, int s, struct sockaddr **name,
367     socklen_t *namelen, struct file **fp)
368 {
369 	struct filedesc *fdp;
370 	struct file *headfp, *nfp = NULL;
371 	struct sockaddr *sa = NULL;
372 	int error;
373 	struct socket *head, *so;
374 	int fd;
375 	u_int fflag;
376 	pid_t pgid;
377 	int tmp;
378 
379 	if (name) {
380 		*name = NULL;
381 		if (*namelen < 0)
382 			return (EINVAL);
383 	}
384 
385 	AUDIT_ARG_FD(s);
386 	fdp = td->td_proc->p_fd;
387 	error = getsock_cap(fdp, s, CAP_ACCEPT, &headfp, &fflag);
388 	if (error)
389 		return (error);
390 	head = headfp->f_data;
391 	if ((head->so_options & SO_ACCEPTCONN) == 0) {
392 		error = EINVAL;
393 		goto done;
394 	}
395 #ifdef MAC
396 	error = mac_socket_check_accept(td->td_ucred, head);
397 	if (error != 0)
398 		goto done;
399 #endif
400 	error = falloc(td, &nfp, &fd, 0);
401 	if (error)
402 		goto done;
403 	ACCEPT_LOCK();
404 	if ((head->so_state & SS_NBIO) && TAILQ_EMPTY(&head->so_comp)) {
405 		ACCEPT_UNLOCK();
406 		error = EWOULDBLOCK;
407 		goto noconnection;
408 	}
409 	while (TAILQ_EMPTY(&head->so_comp) && head->so_error == 0) {
410 		if (head->so_rcv.sb_state & SBS_CANTRCVMORE) {
411 			head->so_error = ECONNABORTED;
412 			break;
413 		}
414 		error = msleep(&head->so_timeo, &accept_mtx, PSOCK | PCATCH,
415 		    "accept", 0);
416 		if (error) {
417 			ACCEPT_UNLOCK();
418 			goto noconnection;
419 		}
420 	}
421 	if (head->so_error) {
422 		error = head->so_error;
423 		head->so_error = 0;
424 		ACCEPT_UNLOCK();
425 		goto noconnection;
426 	}
427 	so = TAILQ_FIRST(&head->so_comp);
428 	KASSERT(!(so->so_qstate & SQ_INCOMP), ("accept1: so SQ_INCOMP"));
429 	KASSERT(so->so_qstate & SQ_COMP, ("accept1: so not SQ_COMP"));
430 
431 	/*
432 	 * Before changing the flags on the socket, we have to bump the
433 	 * reference count.  Otherwise, if the protocol calls sofree(),
434 	 * the socket will be released due to a zero refcount.
435 	 */
436 	SOCK_LOCK(so);			/* soref() and so_state update */
437 	soref(so);			/* file descriptor reference */
438 
439 	TAILQ_REMOVE(&head->so_comp, so, so_list);
440 	head->so_qlen--;
441 	so->so_state |= (head->so_state & SS_NBIO);
442 	so->so_qstate &= ~SQ_COMP;
443 	so->so_head = NULL;
444 
445 	SOCK_UNLOCK(so);
446 	ACCEPT_UNLOCK();
447 
448 	/* An extra reference on `nfp' has been held for us by falloc(). */
449 	td->td_retval[0] = fd;
450 
451 	/* connection has been removed from the listen queue */
452 	KNOTE_UNLOCKED(&head->so_rcv.sb_sel.si_note, 0);
453 
454 	pgid = fgetown(&head->so_sigio);
455 	if (pgid != 0)
456 		fsetown(pgid, &so->so_sigio);
457 
458 	finit(nfp, fflag, DTYPE_SOCKET, so, &socketops);
459 	/* Sync socket nonblocking/async state with file flags */
460 	tmp = fflag & FNONBLOCK;
461 	(void) fo_ioctl(nfp, FIONBIO, &tmp, td->td_ucred, td);
462 	tmp = fflag & FASYNC;
463 	(void) fo_ioctl(nfp, FIOASYNC, &tmp, td->td_ucred, td);
464 	sa = 0;
465 	error = soaccept(so, &sa);
466 	if (error) {
467 		/*
468 		 * return a namelen of zero for older code which might
469 		 * ignore the return value from accept.
470 		 */
471 		if (name)
472 			*namelen = 0;
473 		goto noconnection;
474 	}
475 	if (sa == NULL) {
476 		if (name)
477 			*namelen = 0;
478 		goto done;
479 	}
480 	if (name) {
481 		/* check sa_len before it is destroyed */
482 		if (*namelen > sa->sa_len)
483 			*namelen = sa->sa_len;
484 #ifdef KTRACE
485 		if (KTRPOINT(td, KTR_STRUCT))
486 			ktrsockaddr(sa);
487 #endif
488 		*name = sa;
489 		sa = NULL;
490 	}
491 noconnection:
492 	if (sa)
493 		free(sa, M_SONAME);
494 
495 	/*
496 	 * close the new descriptor, assuming someone hasn't ripped it
497 	 * out from under us.
498 	 */
499 	if (error)
500 		fdclose(fdp, nfp, fd, td);
501 
502 	/*
503 	 * Release explicitly held references before returning.  We return
504 	 * a reference on nfp to the caller on success if they request it.
505 	 */
506 done:
507 	if (fp != NULL) {
508 		if (error == 0) {
509 			*fp = nfp;
510 			nfp = NULL;
511 		} else
512 			*fp = NULL;
513 	}
514 	if (nfp != NULL)
515 		fdrop(nfp, td);
516 	fdrop(headfp, td);
517 	return (error);
518 }
519 
520 int
sys_accept(td,uap)521 sys_accept(td, uap)
522 	struct thread *td;
523 	struct accept_args *uap;
524 {
525 
526 	return (accept1(td, uap, 0));
527 }
528 
529 #ifdef COMPAT_OLDSOCK
530 int
oaccept(td,uap)531 oaccept(td, uap)
532 	struct thread *td;
533 	struct accept_args *uap;
534 {
535 
536 	return (accept1(td, uap, 1));
537 }
538 #endif /* COMPAT_OLDSOCK */
539 
540 /* ARGSUSED */
541 int
sys_connect(td,uap)542 sys_connect(td, uap)
543 	struct thread *td;
544 	struct connect_args /* {
545 		int	s;
546 		caddr_t	name;
547 		int	namelen;
548 	} */ *uap;
549 {
550 	struct sockaddr *sa;
551 	int error;
552 
553 	error = getsockaddr(&sa, uap->name, uap->namelen);
554 	if (error)
555 		return (error);
556 
557 	error = kern_connect(td, uap->s, sa);
558 	free(sa, M_SONAME);
559 	return (error);
560 }
561 
562 
563 int
kern_connect(td,fd,sa)564 kern_connect(td, fd, sa)
565 	struct thread *td;
566 	int fd;
567 	struct sockaddr *sa;
568 {
569 	struct socket *so;
570 	struct file *fp;
571 	int error;
572 	int interrupted = 0;
573 
574 	AUDIT_ARG_FD(fd);
575 	error = getsock_cap(td->td_proc->p_fd, fd, CAP_CONNECT, &fp, NULL);
576 	if (error)
577 		return (error);
578 	so = fp->f_data;
579 	if (so->so_state & SS_ISCONNECTING) {
580 		error = EALREADY;
581 		goto done1;
582 	}
583 #ifdef KTRACE
584 	if (KTRPOINT(td, KTR_STRUCT))
585 		ktrsockaddr(sa);
586 #endif
587 #ifdef MAC
588 	error = mac_socket_check_connect(td->td_ucred, so, sa);
589 	if (error)
590 		goto bad;
591 #endif
592 	error = soconnect(so, sa, td);
593 	if (error)
594 		goto bad;
595 	if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
596 		error = EINPROGRESS;
597 		goto done1;
598 	}
599 	SOCK_LOCK(so);
600 	while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {
601 		error = msleep(&so->so_timeo, SOCK_MTX(so), PSOCK | PCATCH,
602 		    "connec", 0);
603 		if (error) {
604 			if (error == EINTR || error == ERESTART)
605 				interrupted = 1;
606 			break;
607 		}
608 	}
609 	if (error == 0) {
610 		error = so->so_error;
611 		so->so_error = 0;
612 	}
613 	SOCK_UNLOCK(so);
614 bad:
615 	if (!interrupted)
616 		so->so_state &= ~SS_ISCONNECTING;
617 	if (error == ERESTART)
618 		error = EINTR;
619 done1:
620 	fdrop(fp, td);
621 	return (error);
622 }
623 
624 int
kern_socketpair(struct thread * td,int domain,int type,int protocol,int * rsv)625 kern_socketpair(struct thread *td, int domain, int type, int protocol,
626     int *rsv)
627 {
628 	struct filedesc *fdp = td->td_proc->p_fd;
629 	struct file *fp1, *fp2;
630 	struct socket *so1, *so2;
631 	int fd, error, oflag, fflag;
632 
633 	AUDIT_ARG_SOCKET(domain, type, protocol);
634 
635 	oflag = 0;
636 	fflag = 0;
637 	if ((type & SOCK_CLOEXEC) != 0) {
638 		type &= ~SOCK_CLOEXEC;
639 		oflag |= O_CLOEXEC;
640 	}
641 	if ((type & SOCK_NONBLOCK) != 0) {
642 		type &= ~SOCK_NONBLOCK;
643 		fflag |= FNONBLOCK;
644 	}
645 #ifdef MAC
646 	/* We might want to have a separate check for socket pairs. */
647 	error = mac_socket_check_create(td->td_ucred, domain, type,
648 	    protocol);
649 	if (error)
650 		return (error);
651 #endif
652 	error = socreate(domain, &so1, type, protocol, td->td_ucred, td);
653 	if (error)
654 		return (error);
655 	error = socreate(domain, &so2, type, protocol, td->td_ucred, td);
656 	if (error)
657 		goto free1;
658 	/* On success extra reference to `fp1' and 'fp2' is set by falloc. */
659 	error = falloc(td, &fp1, &fd, oflag);
660 	if (error)
661 		goto free2;
662 	rsv[0] = fd;
663 	fp1->f_data = so1;	/* so1 already has ref count */
664 	error = falloc(td, &fp2, &fd, oflag);
665 	if (error)
666 		goto free3;
667 	fp2->f_data = so2;	/* so2 already has ref count */
668 	rsv[1] = fd;
669 	error = soconnect2(so1, so2);
670 	if (error)
671 		goto free4;
672 	if (type == SOCK_DGRAM) {
673 		/*
674 		 * Datagram socket connection is asymmetric.
675 		 */
676 		 error = soconnect2(so2, so1);
677 		 if (error)
678 			goto free4;
679 	}
680 	finit(fp1, FREAD | FWRITE | fflag, DTYPE_SOCKET, fp1->f_data,
681 	    &socketops);
682 	finit(fp2, FREAD | FWRITE | fflag, DTYPE_SOCKET, fp2->f_data,
683 	    &socketops);
684 	if ((fflag & FNONBLOCK) != 0) {
685 		(void) fo_ioctl(fp1, FIONBIO, &fflag, td->td_ucred, td);
686 		(void) fo_ioctl(fp2, FIONBIO, &fflag, td->td_ucred, td);
687 	}
688 	fdrop(fp1, td);
689 	fdrop(fp2, td);
690 	return (0);
691 free4:
692 	fdclose(fdp, fp2, rsv[1], td);
693 	fdrop(fp2, td);
694 free3:
695 	fdclose(fdp, fp1, rsv[0], td);
696 	fdrop(fp1, td);
697 free2:
698 	if (so2 != NULL)
699 		(void)soclose(so2);
700 free1:
701 	if (so1 != NULL)
702 		(void)soclose(so1);
703 	return (error);
704 }
705 
706 int
sys_socketpair(struct thread * td,struct socketpair_args * uap)707 sys_socketpair(struct thread *td, struct socketpair_args *uap)
708 {
709 	int error, sv[2];
710 
711 	error = kern_socketpair(td, uap->domain, uap->type,
712 	    uap->protocol, sv);
713 	if (error)
714 		return (error);
715 	error = copyout(sv, uap->rsv, 2 * sizeof(int));
716 	if (error) {
717 		(void)kern_close(td, sv[0]);
718 		(void)kern_close(td, sv[1]);
719 	}
720 	return (error);
721 }
722 
723 static int
sendit(td,s,mp,flags)724 sendit(td, s, mp, flags)
725 	struct thread *td;
726 	int s;
727 	struct msghdr *mp;
728 	int flags;
729 {
730 	struct mbuf *control;
731 	struct sockaddr *to;
732 	int error;
733 
734 #ifdef CAPABILITY_MODE
735 	if (IN_CAPABILITY_MODE(td) && (mp->msg_name != NULL))
736 		return (ECAPMODE);
737 #endif
738 
739 	if (mp->msg_name != NULL) {
740 		error = getsockaddr(&to, mp->msg_name, mp->msg_namelen);
741 		if (error) {
742 			to = NULL;
743 			goto bad;
744 		}
745 		mp->msg_name = to;
746 	} else {
747 		to = NULL;
748 	}
749 
750 	if (mp->msg_control) {
751 		if (mp->msg_controllen < sizeof(struct cmsghdr)
752 #ifdef COMPAT_OLDSOCK
753 		    && mp->msg_flags != MSG_COMPAT
754 #endif
755 		) {
756 			error = EINVAL;
757 			goto bad;
758 		}
759 		error = sockargs(&control, mp->msg_control,
760 		    mp->msg_controllen, MT_CONTROL);
761 		if (error)
762 			goto bad;
763 #ifdef COMPAT_OLDSOCK
764 		if (mp->msg_flags == MSG_COMPAT) {
765 			struct cmsghdr *cm;
766 
767 			M_PREPEND(control, sizeof(*cm), M_WAIT);
768 			cm = mtod(control, struct cmsghdr *);
769 			cm->cmsg_len = control->m_len;
770 			cm->cmsg_level = SOL_SOCKET;
771 			cm->cmsg_type = SCM_RIGHTS;
772 		}
773 #endif
774 	} else {
775 		control = NULL;
776 	}
777 
778 	error = kern_sendit(td, s, mp, flags, control, UIO_USERSPACE);
779 
780 bad:
781 	if (to)
782 		free(to, M_SONAME);
783 	return (error);
784 }
785 
786 int
kern_sendit(td,s,mp,flags,control,segflg)787 kern_sendit(td, s, mp, flags, control, segflg)
788 	struct thread *td;
789 	int s;
790 	struct msghdr *mp;
791 	int flags;
792 	struct mbuf *control;
793 	enum uio_seg segflg;
794 {
795 	struct file *fp;
796 	struct uio auio;
797 	struct iovec *iov;
798 	struct socket *so;
799 	int i, error;
800 	ssize_t len;
801 	cap_rights_t rights;
802 #ifdef KTRACE
803 	struct uio *ktruio = NULL;
804 #endif
805 
806 	AUDIT_ARG_FD(s);
807 	rights = CAP_WRITE;
808 	if (mp->msg_name != NULL)
809 		rights |= CAP_CONNECT;
810 	error = getsock_cap(td->td_proc->p_fd, s, rights, &fp, NULL);
811 	if (error)
812 		return (error);
813 	so = (struct socket *)fp->f_data;
814 
815 #ifdef KTRACE
816 	if (mp->msg_name != NULL && KTRPOINT(td, KTR_STRUCT))
817 		ktrsockaddr(mp->msg_name);
818 #endif
819 #ifdef MAC
820 	if (mp->msg_name != NULL) {
821 		error = mac_socket_check_connect(td->td_ucred, so,
822 		    mp->msg_name);
823 		if (error)
824 			goto bad;
825 	}
826 	error = mac_socket_check_send(td->td_ucred, so);
827 	if (error)
828 		goto bad;
829 #endif
830 
831 	auio.uio_iov = mp->msg_iov;
832 	auio.uio_iovcnt = mp->msg_iovlen;
833 	auio.uio_segflg = segflg;
834 	auio.uio_rw = UIO_WRITE;
835 	auio.uio_td = td;
836 	auio.uio_offset = 0;			/* XXX */
837 	auio.uio_resid = 0;
838 	iov = mp->msg_iov;
839 	for (i = 0; i < mp->msg_iovlen; i++, iov++) {
840 		if ((auio.uio_resid += iov->iov_len) < 0) {
841 			error = EINVAL;
842 			goto bad;
843 		}
844 	}
845 #ifdef KTRACE
846 	if (KTRPOINT(td, KTR_GENIO))
847 		ktruio = cloneuio(&auio);
848 #endif
849 	len = auio.uio_resid;
850 	error = sosend(so, mp->msg_name, &auio, 0, control, flags, td);
851 	if (error) {
852 		if (auio.uio_resid != len && (error == ERESTART ||
853 		    error == EINTR || error == EWOULDBLOCK))
854 			error = 0;
855 		/* Generation of SIGPIPE can be controlled per socket */
856 		if (error == EPIPE && !(so->so_options & SO_NOSIGPIPE) &&
857 		    !(flags & MSG_NOSIGNAL)) {
858 			PROC_LOCK(td->td_proc);
859 			tdsignal(td, SIGPIPE);
860 			PROC_UNLOCK(td->td_proc);
861 		}
862 	}
863 	if (error == 0)
864 		td->td_retval[0] = len - auio.uio_resid;
865 #ifdef KTRACE
866 	if (ktruio != NULL) {
867 		ktruio->uio_resid = td->td_retval[0];
868 		ktrgenio(s, UIO_WRITE, ktruio, error);
869 	}
870 #endif
871 bad:
872 	fdrop(fp, td);
873 	return (error);
874 }
875 
876 int
sys_sendto(td,uap)877 sys_sendto(td, uap)
878 	struct thread *td;
879 	struct sendto_args /* {
880 		int	s;
881 		caddr_t	buf;
882 		size_t	len;
883 		int	flags;
884 		caddr_t	to;
885 		int	tolen;
886 	} */ *uap;
887 {
888 	struct msghdr msg;
889 	struct iovec aiov;
890 	int error;
891 
892 	msg.msg_name = uap->to;
893 	msg.msg_namelen = uap->tolen;
894 	msg.msg_iov = &aiov;
895 	msg.msg_iovlen = 1;
896 	msg.msg_control = 0;
897 #ifdef COMPAT_OLDSOCK
898 	msg.msg_flags = 0;
899 #endif
900 	aiov.iov_base = uap->buf;
901 	aiov.iov_len = uap->len;
902 	error = sendit(td, uap->s, &msg, uap->flags);
903 	return (error);
904 }
905 
906 #ifdef COMPAT_OLDSOCK
907 int
osend(td,uap)908 osend(td, uap)
909 	struct thread *td;
910 	struct osend_args /* {
911 		int	s;
912 		caddr_t	buf;
913 		int	len;
914 		int	flags;
915 	} */ *uap;
916 {
917 	struct msghdr msg;
918 	struct iovec aiov;
919 	int error;
920 
921 	msg.msg_name = 0;
922 	msg.msg_namelen = 0;
923 	msg.msg_iov = &aiov;
924 	msg.msg_iovlen = 1;
925 	aiov.iov_base = uap->buf;
926 	aiov.iov_len = uap->len;
927 	msg.msg_control = 0;
928 	msg.msg_flags = 0;
929 	error = sendit(td, uap->s, &msg, uap->flags);
930 	return (error);
931 }
932 
933 int
osendmsg(td,uap)934 osendmsg(td, uap)
935 	struct thread *td;
936 	struct osendmsg_args /* {
937 		int	s;
938 		caddr_t	msg;
939 		int	flags;
940 	} */ *uap;
941 {
942 	struct msghdr msg;
943 	struct iovec *iov;
944 	int error;
945 
946 	error = copyin(uap->msg, &msg, sizeof (struct omsghdr));
947 	if (error)
948 		return (error);
949 	error = copyiniov(msg.msg_iov, msg.msg_iovlen, &iov, EMSGSIZE);
950 	if (error)
951 		return (error);
952 	msg.msg_iov = iov;
953 	msg.msg_flags = MSG_COMPAT;
954 	error = sendit(td, uap->s, &msg, uap->flags);
955 	free(iov, M_IOV);
956 	return (error);
957 }
958 #endif
959 
960 int
sys_sendmsg(td,uap)961 sys_sendmsg(td, uap)
962 	struct thread *td;
963 	struct sendmsg_args /* {
964 		int	s;
965 		caddr_t	msg;
966 		int	flags;
967 	} */ *uap;
968 {
969 	struct msghdr msg;
970 	struct iovec *iov;
971 	int error;
972 
973 	error = copyin(uap->msg, &msg, sizeof (msg));
974 	if (error)
975 		return (error);
976 	error = copyiniov(msg.msg_iov, msg.msg_iovlen, &iov, EMSGSIZE);
977 	if (error)
978 		return (error);
979 	msg.msg_iov = iov;
980 #ifdef COMPAT_OLDSOCK
981 	msg.msg_flags = 0;
982 #endif
983 	error = sendit(td, uap->s, &msg, uap->flags);
984 	free(iov, M_IOV);
985 	return (error);
986 }
987 
988 int
kern_recvit(td,s,mp,fromseg,controlp)989 kern_recvit(td, s, mp, fromseg, controlp)
990 	struct thread *td;
991 	int s;
992 	struct msghdr *mp;
993 	enum uio_seg fromseg;
994 	struct mbuf **controlp;
995 {
996 	struct uio auio;
997 	struct iovec *iov;
998 	int i;
999 	ssize_t len;
1000 	int error;
1001 	struct mbuf *m, *control = 0;
1002 	caddr_t ctlbuf;
1003 	struct file *fp;
1004 	struct socket *so;
1005 	struct sockaddr *fromsa = 0;
1006 #ifdef KTRACE
1007 	struct uio *ktruio = NULL;
1008 #endif
1009 
1010 	if (controlp != NULL)
1011 		*controlp = NULL;
1012 
1013 	AUDIT_ARG_FD(s);
1014 	error = getsock_cap(td->td_proc->p_fd, s, CAP_READ, &fp, NULL);
1015 	if (error)
1016 		return (error);
1017 	so = fp->f_data;
1018 
1019 #ifdef MAC
1020 	error = mac_socket_check_receive(td->td_ucred, so);
1021 	if (error) {
1022 		fdrop(fp, td);
1023 		return (error);
1024 	}
1025 #endif
1026 
1027 	auio.uio_iov = mp->msg_iov;
1028 	auio.uio_iovcnt = mp->msg_iovlen;
1029 	auio.uio_segflg = UIO_USERSPACE;
1030 	auio.uio_rw = UIO_READ;
1031 	auio.uio_td = td;
1032 	auio.uio_offset = 0;			/* XXX */
1033 	auio.uio_resid = 0;
1034 	iov = mp->msg_iov;
1035 	for (i = 0; i < mp->msg_iovlen; i++, iov++) {
1036 		if ((auio.uio_resid += iov->iov_len) < 0) {
1037 			fdrop(fp, td);
1038 			return (EINVAL);
1039 		}
1040 	}
1041 #ifdef KTRACE
1042 	if (KTRPOINT(td, KTR_GENIO))
1043 		ktruio = cloneuio(&auio);
1044 #endif
1045 	len = auio.uio_resid;
1046 	error = soreceive(so, &fromsa, &auio, (struct mbuf **)0,
1047 	    (mp->msg_control || controlp) ? &control : (struct mbuf **)0,
1048 	    &mp->msg_flags);
1049 	if (error) {
1050 		if (auio.uio_resid != len && (error == ERESTART ||
1051 		    error == EINTR || error == EWOULDBLOCK))
1052 			error = 0;
1053 	}
1054 #ifdef KTRACE
1055 	if (ktruio != NULL) {
1056 		ktruio->uio_resid = len - auio.uio_resid;
1057 		ktrgenio(s, UIO_READ, ktruio, error);
1058 	}
1059 #endif
1060 	if (error)
1061 		goto out;
1062 	td->td_retval[0] = len - auio.uio_resid;
1063 	if (mp->msg_name) {
1064 		len = mp->msg_namelen;
1065 		if (len <= 0 || fromsa == 0)
1066 			len = 0;
1067 		else {
1068 			/* save sa_len before it is destroyed by MSG_COMPAT */
1069 			len = MIN(len, fromsa->sa_len);
1070 #ifdef COMPAT_OLDSOCK
1071 			if (mp->msg_flags & MSG_COMPAT)
1072 				((struct osockaddr *)fromsa)->sa_family =
1073 				    fromsa->sa_family;
1074 #endif
1075 			if (fromseg == UIO_USERSPACE) {
1076 				error = copyout(fromsa, mp->msg_name,
1077 				    (unsigned)len);
1078 				if (error)
1079 					goto out;
1080 			} else
1081 				bcopy(fromsa, mp->msg_name, len);
1082 		}
1083 		mp->msg_namelen = len;
1084 	}
1085 	if (mp->msg_control && controlp == NULL) {
1086 #ifdef COMPAT_OLDSOCK
1087 		/*
1088 		 * We assume that old recvmsg calls won't receive access
1089 		 * rights and other control info, esp. as control info
1090 		 * is always optional and those options didn't exist in 4.3.
1091 		 * If we receive rights, trim the cmsghdr; anything else
1092 		 * is tossed.
1093 		 */
1094 		if (control && mp->msg_flags & MSG_COMPAT) {
1095 			if (mtod(control, struct cmsghdr *)->cmsg_level !=
1096 			    SOL_SOCKET ||
1097 			    mtod(control, struct cmsghdr *)->cmsg_type !=
1098 			    SCM_RIGHTS) {
1099 				mp->msg_controllen = 0;
1100 				goto out;
1101 			}
1102 			control->m_len -= sizeof (struct cmsghdr);
1103 			control->m_data += sizeof (struct cmsghdr);
1104 		}
1105 #endif
1106 		len = mp->msg_controllen;
1107 		m = control;
1108 		mp->msg_controllen = 0;
1109 		ctlbuf = mp->msg_control;
1110 
1111 		while (m && len > 0) {
1112 			unsigned int tocopy;
1113 
1114 			if (len >= m->m_len)
1115 				tocopy = m->m_len;
1116 			else {
1117 				mp->msg_flags |= MSG_CTRUNC;
1118 				tocopy = len;
1119 			}
1120 
1121 			if ((error = copyout(mtod(m, caddr_t),
1122 					ctlbuf, tocopy)) != 0)
1123 				goto out;
1124 
1125 			ctlbuf += tocopy;
1126 			len -= tocopy;
1127 			m = m->m_next;
1128 		}
1129 		mp->msg_controllen = ctlbuf - (caddr_t)mp->msg_control;
1130 	}
1131 out:
1132 	fdrop(fp, td);
1133 #ifdef KTRACE
1134 	if (fromsa && KTRPOINT(td, KTR_STRUCT))
1135 		ktrsockaddr(fromsa);
1136 #endif
1137 	if (fromsa)
1138 		free(fromsa, M_SONAME);
1139 
1140 	if (error == 0 && controlp != NULL)
1141 		*controlp = control;
1142 	else  if (control)
1143 		m_freem(control);
1144 
1145 	return (error);
1146 }
1147 
1148 static int
recvit(td,s,mp,namelenp)1149 recvit(td, s, mp, namelenp)
1150 	struct thread *td;
1151 	int s;
1152 	struct msghdr *mp;
1153 	void *namelenp;
1154 {
1155 	int error;
1156 
1157 	error = kern_recvit(td, s, mp, UIO_USERSPACE, NULL);
1158 	if (error)
1159 		return (error);
1160 	if (namelenp) {
1161 		error = copyout(&mp->msg_namelen, namelenp, sizeof (socklen_t));
1162 #ifdef COMPAT_OLDSOCK
1163 		if (mp->msg_flags & MSG_COMPAT)
1164 			error = 0;	/* old recvfrom didn't check */
1165 #endif
1166 	}
1167 	return (error);
1168 }
1169 
1170 int
sys_recvfrom(td,uap)1171 sys_recvfrom(td, uap)
1172 	struct thread *td;
1173 	struct recvfrom_args /* {
1174 		int	s;
1175 		caddr_t	buf;
1176 		size_t	len;
1177 		int	flags;
1178 		struct sockaddr * __restrict	from;
1179 		socklen_t * __restrict fromlenaddr;
1180 	} */ *uap;
1181 {
1182 	struct msghdr msg;
1183 	struct iovec aiov;
1184 	int error;
1185 
1186 	if (uap->fromlenaddr) {
1187 		error = copyin(uap->fromlenaddr,
1188 		    &msg.msg_namelen, sizeof (msg.msg_namelen));
1189 		if (error)
1190 			goto done2;
1191 	} else {
1192 		msg.msg_namelen = 0;
1193 	}
1194 	msg.msg_name = uap->from;
1195 	msg.msg_iov = &aiov;
1196 	msg.msg_iovlen = 1;
1197 	aiov.iov_base = uap->buf;
1198 	aiov.iov_len = uap->len;
1199 	msg.msg_control = 0;
1200 	msg.msg_flags = uap->flags;
1201 	error = recvit(td, uap->s, &msg, uap->fromlenaddr);
1202 done2:
1203 	return(error);
1204 }
1205 
1206 #ifdef COMPAT_OLDSOCK
1207 int
orecvfrom(td,uap)1208 orecvfrom(td, uap)
1209 	struct thread *td;
1210 	struct recvfrom_args *uap;
1211 {
1212 
1213 	uap->flags |= MSG_COMPAT;
1214 	return (sys_recvfrom(td, uap));
1215 }
1216 #endif
1217 
1218 #ifdef COMPAT_OLDSOCK
1219 int
orecv(td,uap)1220 orecv(td, uap)
1221 	struct thread *td;
1222 	struct orecv_args /* {
1223 		int	s;
1224 		caddr_t	buf;
1225 		int	len;
1226 		int	flags;
1227 	} */ *uap;
1228 {
1229 	struct msghdr msg;
1230 	struct iovec aiov;
1231 	int error;
1232 
1233 	msg.msg_name = 0;
1234 	msg.msg_namelen = 0;
1235 	msg.msg_iov = &aiov;
1236 	msg.msg_iovlen = 1;
1237 	aiov.iov_base = uap->buf;
1238 	aiov.iov_len = uap->len;
1239 	msg.msg_control = 0;
1240 	msg.msg_flags = uap->flags;
1241 	error = recvit(td, uap->s, &msg, NULL);
1242 	return (error);
1243 }
1244 
1245 /*
1246  * Old recvmsg.  This code takes advantage of the fact that the old msghdr
1247  * overlays the new one, missing only the flags, and with the (old) access
1248  * rights where the control fields are now.
1249  */
1250 int
orecvmsg(td,uap)1251 orecvmsg(td, uap)
1252 	struct thread *td;
1253 	struct orecvmsg_args /* {
1254 		int	s;
1255 		struct	omsghdr *msg;
1256 		int	flags;
1257 	} */ *uap;
1258 {
1259 	struct msghdr msg;
1260 	struct iovec *iov;
1261 	int error;
1262 
1263 	error = copyin(uap->msg, &msg, sizeof (struct omsghdr));
1264 	if (error)
1265 		return (error);
1266 	error = copyiniov(msg.msg_iov, msg.msg_iovlen, &iov, EMSGSIZE);
1267 	if (error)
1268 		return (error);
1269 	msg.msg_flags = uap->flags | MSG_COMPAT;
1270 	msg.msg_iov = iov;
1271 	error = recvit(td, uap->s, &msg, &uap->msg->msg_namelen);
1272 	if (msg.msg_controllen && error == 0)
1273 		error = copyout(&msg.msg_controllen,
1274 		    &uap->msg->msg_accrightslen, sizeof (int));
1275 	free(iov, M_IOV);
1276 	return (error);
1277 }
1278 #endif
1279 
1280 int
sys_recvmsg(td,uap)1281 sys_recvmsg(td, uap)
1282 	struct thread *td;
1283 	struct recvmsg_args /* {
1284 		int	s;
1285 		struct	msghdr *msg;
1286 		int	flags;
1287 	} */ *uap;
1288 {
1289 	struct msghdr msg;
1290 	struct iovec *uiov, *iov;
1291 	int error;
1292 
1293 	error = copyin(uap->msg, &msg, sizeof (msg));
1294 	if (error)
1295 		return (error);
1296 	error = copyiniov(msg.msg_iov, msg.msg_iovlen, &iov, EMSGSIZE);
1297 	if (error)
1298 		return (error);
1299 	msg.msg_flags = uap->flags;
1300 #ifdef COMPAT_OLDSOCK
1301 	msg.msg_flags &= ~MSG_COMPAT;
1302 #endif
1303 	uiov = msg.msg_iov;
1304 	msg.msg_iov = iov;
1305 	error = recvit(td, uap->s, &msg, NULL);
1306 	if (error == 0) {
1307 		msg.msg_iov = uiov;
1308 		error = copyout(&msg, uap->msg, sizeof(msg));
1309 	}
1310 	free(iov, M_IOV);
1311 	return (error);
1312 }
1313 
1314 /* ARGSUSED */
1315 int
sys_shutdown(td,uap)1316 sys_shutdown(td, uap)
1317 	struct thread *td;
1318 	struct shutdown_args /* {
1319 		int	s;
1320 		int	how;
1321 	} */ *uap;
1322 {
1323 	struct socket *so;
1324 	struct file *fp;
1325 	int error;
1326 
1327 	AUDIT_ARG_FD(uap->s);
1328 	error = getsock_cap(td->td_proc->p_fd, uap->s, CAP_SHUTDOWN, &fp,
1329 	    NULL);
1330 	if (error == 0) {
1331 		so = fp->f_data;
1332 		error = soshutdown(so, uap->how);
1333 		fdrop(fp, td);
1334 	}
1335 	return (error);
1336 }
1337 
1338 /* ARGSUSED */
1339 int
sys_setsockopt(td,uap)1340 sys_setsockopt(td, uap)
1341 	struct thread *td;
1342 	struct setsockopt_args /* {
1343 		int	s;
1344 		int	level;
1345 		int	name;
1346 		caddr_t	val;
1347 		int	valsize;
1348 	} */ *uap;
1349 {
1350 
1351 	return (kern_setsockopt(td, uap->s, uap->level, uap->name,
1352 	    uap->val, UIO_USERSPACE, uap->valsize));
1353 }
1354 
1355 int
kern_setsockopt(td,s,level,name,val,valseg,valsize)1356 kern_setsockopt(td, s, level, name, val, valseg, valsize)
1357 	struct thread *td;
1358 	int s;
1359 	int level;
1360 	int name;
1361 	void *val;
1362 	enum uio_seg valseg;
1363 	socklen_t valsize;
1364 {
1365 	int error;
1366 	struct socket *so;
1367 	struct file *fp;
1368 	struct sockopt sopt;
1369 
1370 	if (val == NULL && valsize != 0)
1371 		return (EFAULT);
1372 	if ((int)valsize < 0)
1373 		return (EINVAL);
1374 
1375 	sopt.sopt_dir = SOPT_SET;
1376 	sopt.sopt_level = level;
1377 	sopt.sopt_name = name;
1378 	sopt.sopt_val = val;
1379 	sopt.sopt_valsize = valsize;
1380 	switch (valseg) {
1381 	case UIO_USERSPACE:
1382 		sopt.sopt_td = td;
1383 		break;
1384 	case UIO_SYSSPACE:
1385 		sopt.sopt_td = NULL;
1386 		break;
1387 	default:
1388 		panic("kern_setsockopt called with bad valseg");
1389 	}
1390 
1391 	AUDIT_ARG_FD(s);
1392 	error = getsock_cap(td->td_proc->p_fd, s, CAP_SETSOCKOPT, &fp, NULL);
1393 	if (error == 0) {
1394 		so = fp->f_data;
1395 		error = sosetopt(so, &sopt);
1396 		fdrop(fp, td);
1397 	}
1398 	return(error);
1399 }
1400 
1401 /* ARGSUSED */
1402 int
sys_getsockopt(td,uap)1403 sys_getsockopt(td, uap)
1404 	struct thread *td;
1405 	struct getsockopt_args /* {
1406 		int	s;
1407 		int	level;
1408 		int	name;
1409 		void * __restrict	val;
1410 		socklen_t * __restrict avalsize;
1411 	} */ *uap;
1412 {
1413 	socklen_t valsize;
1414 	int	error;
1415 
1416 	if (uap->val) {
1417 		error = copyin(uap->avalsize, &valsize, sizeof (valsize));
1418 		if (error)
1419 			return (error);
1420 	}
1421 
1422 	error = kern_getsockopt(td, uap->s, uap->level, uap->name,
1423 	    uap->val, UIO_USERSPACE, &valsize);
1424 
1425 	if (error == 0)
1426 		error = copyout(&valsize, uap->avalsize, sizeof (valsize));
1427 	return (error);
1428 }
1429 
1430 /*
1431  * Kernel version of getsockopt.
1432  * optval can be a userland or userspace. optlen is always a kernel pointer.
1433  */
1434 int
kern_getsockopt(td,s,level,name,val,valseg,valsize)1435 kern_getsockopt(td, s, level, name, val, valseg, valsize)
1436 	struct thread *td;
1437 	int s;
1438 	int level;
1439 	int name;
1440 	void *val;
1441 	enum uio_seg valseg;
1442 	socklen_t *valsize;
1443 {
1444 	int error;
1445 	struct  socket *so;
1446 	struct file *fp;
1447 	struct	sockopt sopt;
1448 
1449 	if (val == NULL)
1450 		*valsize = 0;
1451 	if ((int)*valsize < 0)
1452 		return (EINVAL);
1453 
1454 	sopt.sopt_dir = SOPT_GET;
1455 	sopt.sopt_level = level;
1456 	sopt.sopt_name = name;
1457 	sopt.sopt_val = val;
1458 	sopt.sopt_valsize = (size_t)*valsize; /* checked non-negative above */
1459 	switch (valseg) {
1460 	case UIO_USERSPACE:
1461 		sopt.sopt_td = td;
1462 		break;
1463 	case UIO_SYSSPACE:
1464 		sopt.sopt_td = NULL;
1465 		break;
1466 	default:
1467 		panic("kern_getsockopt called with bad valseg");
1468 	}
1469 
1470 	AUDIT_ARG_FD(s);
1471 	error = getsock_cap(td->td_proc->p_fd, s, CAP_GETSOCKOPT, &fp, NULL);
1472 	if (error == 0) {
1473 		so = fp->f_data;
1474 		error = sogetopt(so, &sopt);
1475 		*valsize = sopt.sopt_valsize;
1476 		fdrop(fp, td);
1477 	}
1478 	return (error);
1479 }
1480 
1481 /*
1482  * getsockname1() - Get socket name.
1483  */
1484 /* ARGSUSED */
1485 static int
getsockname1(td,uap,compat)1486 getsockname1(td, uap, compat)
1487 	struct thread *td;
1488 	struct getsockname_args /* {
1489 		int	fdes;
1490 		struct sockaddr * __restrict asa;
1491 		socklen_t * __restrict alen;
1492 	} */ *uap;
1493 	int compat;
1494 {
1495 	struct sockaddr *sa;
1496 	socklen_t len;
1497 	int error;
1498 
1499 	error = copyin(uap->alen, &len, sizeof(len));
1500 	if (error)
1501 		return (error);
1502 
1503 	error = kern_getsockname(td, uap->fdes, &sa, &len);
1504 	if (error)
1505 		return (error);
1506 
1507 	if (len != 0) {
1508 #ifdef COMPAT_OLDSOCK
1509 		if (compat)
1510 			((struct osockaddr *)sa)->sa_family = sa->sa_family;
1511 #endif
1512 		error = copyout(sa, uap->asa, (u_int)len);
1513 	}
1514 	free(sa, M_SONAME);
1515 	if (error == 0)
1516 		error = copyout(&len, uap->alen, sizeof(len));
1517 	return (error);
1518 }
1519 
1520 int
kern_getsockname(struct thread * td,int fd,struct sockaddr ** sa,socklen_t * alen)1521 kern_getsockname(struct thread *td, int fd, struct sockaddr **sa,
1522     socklen_t *alen)
1523 {
1524 	struct socket *so;
1525 	struct file *fp;
1526 	socklen_t len;
1527 	int error;
1528 
1529 	if (*alen < 0)
1530 		return (EINVAL);
1531 
1532 	AUDIT_ARG_FD(fd);
1533 	error = getsock_cap(td->td_proc->p_fd, fd, CAP_GETSOCKNAME, &fp, NULL);
1534 	if (error)
1535 		return (error);
1536 	so = fp->f_data;
1537 	*sa = NULL;
1538 	CURVNET_SET(so->so_vnet);
1539 	error = (*so->so_proto->pr_usrreqs->pru_sockaddr)(so, sa);
1540 	CURVNET_RESTORE();
1541 	if (error)
1542 		goto bad;
1543 	if (*sa == NULL)
1544 		len = 0;
1545 	else
1546 		len = MIN(*alen, (*sa)->sa_len);
1547 	*alen = len;
1548 #ifdef KTRACE
1549 	if (KTRPOINT(td, KTR_STRUCT))
1550 		ktrsockaddr(*sa);
1551 #endif
1552 bad:
1553 	fdrop(fp, td);
1554 	if (error && *sa) {
1555 		free(*sa, M_SONAME);
1556 		*sa = NULL;
1557 	}
1558 	return (error);
1559 }
1560 
1561 int
sys_getsockname(td,uap)1562 sys_getsockname(td, uap)
1563 	struct thread *td;
1564 	struct getsockname_args *uap;
1565 {
1566 
1567 	return (getsockname1(td, uap, 0));
1568 }
1569 
1570 #ifdef COMPAT_OLDSOCK
1571 int
ogetsockname(td,uap)1572 ogetsockname(td, uap)
1573 	struct thread *td;
1574 	struct getsockname_args *uap;
1575 {
1576 
1577 	return (getsockname1(td, uap, 1));
1578 }
1579 #endif /* COMPAT_OLDSOCK */
1580 
1581 /*
1582  * getpeername1() - Get name of peer for connected socket.
1583  */
1584 /* ARGSUSED */
1585 static int
getpeername1(td,uap,compat)1586 getpeername1(td, uap, compat)
1587 	struct thread *td;
1588 	struct getpeername_args /* {
1589 		int	fdes;
1590 		struct sockaddr * __restrict	asa;
1591 		socklen_t * __restrict	alen;
1592 	} */ *uap;
1593 	int compat;
1594 {
1595 	struct sockaddr *sa;
1596 	socklen_t len;
1597 	int error;
1598 
1599 	error = copyin(uap->alen, &len, sizeof (len));
1600 	if (error)
1601 		return (error);
1602 
1603 	error = kern_getpeername(td, uap->fdes, &sa, &len);
1604 	if (error)
1605 		return (error);
1606 
1607 	if (len != 0) {
1608 #ifdef COMPAT_OLDSOCK
1609 		if (compat)
1610 			((struct osockaddr *)sa)->sa_family = sa->sa_family;
1611 #endif
1612 		error = copyout(sa, uap->asa, (u_int)len);
1613 	}
1614 	free(sa, M_SONAME);
1615 	if (error == 0)
1616 		error = copyout(&len, uap->alen, sizeof(len));
1617 	return (error);
1618 }
1619 
1620 int
kern_getpeername(struct thread * td,int fd,struct sockaddr ** sa,socklen_t * alen)1621 kern_getpeername(struct thread *td, int fd, struct sockaddr **sa,
1622     socklen_t *alen)
1623 {
1624 	struct socket *so;
1625 	struct file *fp;
1626 	socklen_t len;
1627 	int error;
1628 
1629 	if (*alen < 0)
1630 		return (EINVAL);
1631 
1632 	AUDIT_ARG_FD(fd);
1633 	error = getsock_cap(td->td_proc->p_fd, fd, CAP_GETPEERNAME, &fp, NULL);
1634 	if (error)
1635 		return (error);
1636 	so = fp->f_data;
1637 	if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0) {
1638 		error = ENOTCONN;
1639 		goto done;
1640 	}
1641 	*sa = NULL;
1642 	CURVNET_SET(so->so_vnet);
1643 	error = (*so->so_proto->pr_usrreqs->pru_peeraddr)(so, sa);
1644 	CURVNET_RESTORE();
1645 	if (error)
1646 		goto bad;
1647 	if (*sa == NULL)
1648 		len = 0;
1649 	else
1650 		len = MIN(*alen, (*sa)->sa_len);
1651 	*alen = len;
1652 #ifdef KTRACE
1653 	if (KTRPOINT(td, KTR_STRUCT))
1654 		ktrsockaddr(*sa);
1655 #endif
1656 bad:
1657 	if (error && *sa) {
1658 		free(*sa, M_SONAME);
1659 		*sa = NULL;
1660 	}
1661 done:
1662 	fdrop(fp, td);
1663 	return (error);
1664 }
1665 
1666 int
sys_getpeername(td,uap)1667 sys_getpeername(td, uap)
1668 	struct thread *td;
1669 	struct getpeername_args *uap;
1670 {
1671 
1672 	return (getpeername1(td, uap, 0));
1673 }
1674 
1675 #ifdef COMPAT_OLDSOCK
1676 int
ogetpeername(td,uap)1677 ogetpeername(td, uap)
1678 	struct thread *td;
1679 	struct ogetpeername_args *uap;
1680 {
1681 
1682 	/* XXX uap should have type `getpeername_args *' to begin with. */
1683 	return (getpeername1(td, (struct getpeername_args *)uap, 1));
1684 }
1685 #endif /* COMPAT_OLDSOCK */
1686 
1687 int
sockargs(mp,buf,buflen,type)1688 sockargs(mp, buf, buflen, type)
1689 	struct mbuf **mp;
1690 	caddr_t buf;
1691 	int buflen, type;
1692 {
1693 	struct sockaddr *sa;
1694 	struct mbuf *m;
1695 	int error;
1696 
1697 	if ((u_int)buflen > MLEN) {
1698 #ifdef COMPAT_OLDSOCK
1699 		if (type == MT_SONAME && (u_int)buflen <= 112)
1700 			buflen = MLEN;		/* unix domain compat. hack */
1701 		else
1702 #endif
1703 			if ((u_int)buflen > MCLBYTES)
1704 				return (EINVAL);
1705 	}
1706 	m = m_get(M_WAIT, type);
1707 	if ((u_int)buflen > MLEN)
1708 		MCLGET(m, M_WAIT);
1709 	m->m_len = buflen;
1710 	error = copyin(buf, mtod(m, caddr_t), (u_int)buflen);
1711 	if (error)
1712 		(void) m_free(m);
1713 	else {
1714 		*mp = m;
1715 		if (type == MT_SONAME) {
1716 			sa = mtod(m, struct sockaddr *);
1717 
1718 #if defined(COMPAT_OLDSOCK) && BYTE_ORDER != BIG_ENDIAN
1719 			if (sa->sa_family == 0 && sa->sa_len < AF_MAX)
1720 				sa->sa_family = sa->sa_len;
1721 #endif
1722 			sa->sa_len = buflen;
1723 		}
1724 	}
1725 	return (error);
1726 }
1727 
1728 int
getsockaddr(namp,uaddr,len)1729 getsockaddr(namp, uaddr, len)
1730 	struct sockaddr **namp;
1731 	caddr_t uaddr;
1732 	size_t len;
1733 {
1734 	struct sockaddr *sa;
1735 	int error;
1736 
1737 	if (len > SOCK_MAXADDRLEN)
1738 		return (ENAMETOOLONG);
1739 	if (len < offsetof(struct sockaddr, sa_data[0]))
1740 		return (EINVAL);
1741 	sa = malloc(len, M_SONAME, M_WAITOK);
1742 	error = copyin(uaddr, sa, len);
1743 	if (error) {
1744 		free(sa, M_SONAME);
1745 	} else {
1746 #if defined(COMPAT_OLDSOCK) && BYTE_ORDER != BIG_ENDIAN
1747 		if (sa->sa_family == 0 && sa->sa_len < AF_MAX)
1748 			sa->sa_family = sa->sa_len;
1749 #endif
1750 		sa->sa_len = len;
1751 		*namp = sa;
1752 	}
1753 	return (error);
1754 }
1755 
1756 #include <sys/condvar.h>
1757 
1758 struct sendfile_sync {
1759 	struct mtx	mtx;
1760 	struct cv	cv;
1761 	unsigned 	count;
1762 };
1763 
1764 /*
1765  * Detach mapped page and release resources back to the system.
1766  */
1767 void
sf_buf_mext(void * addr,void * args)1768 sf_buf_mext(void *addr, void *args)
1769 {
1770 	vm_page_t m;
1771 	struct sendfile_sync *sfs;
1772 
1773 	m = sf_buf_page(args);
1774 	sf_buf_free(args);
1775 	vm_page_lock(m);
1776 	vm_page_unwire(m, 0);
1777 	/*
1778 	 * Check for the object going away on us. This can
1779 	 * happen since we don't hold a reference to it.
1780 	 * If so, we're responsible for freeing the page.
1781 	 */
1782 	if (m->wire_count == 0 && m->object == NULL)
1783 		vm_page_free(m);
1784 	vm_page_unlock(m);
1785 	if (addr == NULL)
1786 		return;
1787 	sfs = addr;
1788 	mtx_lock(&sfs->mtx);
1789 	KASSERT(sfs->count> 0, ("Sendfile sync botchup count == 0"));
1790 	if (--sfs->count == 0)
1791 		cv_signal(&sfs->cv);
1792 	mtx_unlock(&sfs->mtx);
1793 }
1794 
1795 /*
1796  * sendfile(2)
1797  *
1798  * int sendfile(int fd, int s, off_t offset, size_t nbytes,
1799  *	 struct sf_hdtr *hdtr, off_t *sbytes, int flags)
1800  *
1801  * Send a file specified by 'fd' and starting at 'offset' to a socket
1802  * specified by 's'. Send only 'nbytes' of the file or until EOF if nbytes ==
1803  * 0.  Optionally add a header and/or trailer to the socket output.  If
1804  * specified, write the total number of bytes sent into *sbytes.
1805  */
1806 int
sys_sendfile(struct thread * td,struct sendfile_args * uap)1807 sys_sendfile(struct thread *td, struct sendfile_args *uap)
1808 {
1809 
1810 	return (do_sendfile(td, uap, 0));
1811 }
1812 
1813 static int
do_sendfile(struct thread * td,struct sendfile_args * uap,int compat)1814 do_sendfile(struct thread *td, struct sendfile_args *uap, int compat)
1815 {
1816 	struct sf_hdtr hdtr;
1817 	struct uio *hdr_uio, *trl_uio;
1818 	int error;
1819 
1820 	hdr_uio = trl_uio = NULL;
1821 
1822 	if (uap->hdtr != NULL) {
1823 		error = copyin(uap->hdtr, &hdtr, sizeof(hdtr));
1824 		if (error)
1825 			goto out;
1826 		if (hdtr.headers != NULL) {
1827 			error = copyinuio(hdtr.headers, hdtr.hdr_cnt, &hdr_uio);
1828 			if (error)
1829 				goto out;
1830 		}
1831 		if (hdtr.trailers != NULL) {
1832 			error = copyinuio(hdtr.trailers, hdtr.trl_cnt, &trl_uio);
1833 			if (error)
1834 				goto out;
1835 
1836 		}
1837 	}
1838 
1839 	error = kern_sendfile(td, uap, hdr_uio, trl_uio, compat);
1840 out:
1841 	if (hdr_uio)
1842 		free(hdr_uio, M_IOV);
1843 	if (trl_uio)
1844 		free(trl_uio, M_IOV);
1845 	return (error);
1846 }
1847 
1848 #ifdef COMPAT_FREEBSD4
1849 int
freebsd4_sendfile(struct thread * td,struct freebsd4_sendfile_args * uap)1850 freebsd4_sendfile(struct thread *td, struct freebsd4_sendfile_args *uap)
1851 {
1852 	struct sendfile_args args;
1853 
1854 	args.fd = uap->fd;
1855 	args.s = uap->s;
1856 	args.offset = uap->offset;
1857 	args.nbytes = uap->nbytes;
1858 	args.hdtr = uap->hdtr;
1859 	args.sbytes = uap->sbytes;
1860 	args.flags = uap->flags;
1861 
1862 	return (do_sendfile(td, &args, 1));
1863 }
1864 #endif /* COMPAT_FREEBSD4 */
1865 
1866 int
kern_sendfile(struct thread * td,struct sendfile_args * uap,struct uio * hdr_uio,struct uio * trl_uio,int compat)1867 kern_sendfile(struct thread *td, struct sendfile_args *uap,
1868     struct uio *hdr_uio, struct uio *trl_uio, int compat)
1869 {
1870 	struct file *sock_fp;
1871 	struct vnode *vp;
1872 	struct vm_object *obj = NULL;
1873 	struct socket *so = NULL;
1874 	struct mbuf *m = NULL;
1875 	struct sf_buf *sf;
1876 	struct vm_page *pg;
1877 	struct vattr va;
1878 	off_t off, xfsize, fsbytes = 0, sbytes = 0, rem = 0;
1879 	int error, hdrlen = 0, mnw = 0;
1880 	int vfslocked;
1881 	int bsize;
1882 	struct sendfile_sync *sfs = NULL;
1883 
1884 	/*
1885 	 * The file descriptor must be a regular file and have a
1886 	 * backing VM object.
1887 	 * File offset must be positive.  If it goes beyond EOF
1888 	 * we send only the header/trailer and no payload data.
1889 	 */
1890 	AUDIT_ARG_FD(uap->fd);
1891 	if ((error = fgetvp_read(td, uap->fd, CAP_READ, &vp)) != 0)
1892 		goto out;
1893 	vfslocked = VFS_LOCK_GIANT(vp->v_mount);
1894 	vn_lock(vp, LK_SHARED | LK_RETRY);
1895 	if (vp->v_type == VREG) {
1896 		bsize = vp->v_mount->mnt_stat.f_iosize;
1897 		if (uap->nbytes == 0) {
1898 			error = VOP_GETATTR(vp, &va, td->td_ucred);
1899 			if (error != 0) {
1900 				VOP_UNLOCK(vp, 0);
1901 				VFS_UNLOCK_GIANT(vfslocked);
1902 				obj = NULL;
1903 				goto out;
1904 			}
1905 			rem = va.va_size;
1906 		} else
1907 			rem = uap->nbytes;
1908 		obj = vp->v_object;
1909 		if (obj != NULL) {
1910 			/*
1911 			 * Temporarily increase the backing VM
1912 			 * object's reference count so that a forced
1913 			 * reclamation of its vnode does not
1914 			 * immediately destroy it.
1915 			 */
1916 			VM_OBJECT_LOCK(obj);
1917 			if ((obj->flags & OBJ_DEAD) == 0) {
1918 				vm_object_reference_locked(obj);
1919 				VM_OBJECT_UNLOCK(obj);
1920 			} else {
1921 				VM_OBJECT_UNLOCK(obj);
1922 				obj = NULL;
1923 			}
1924 		}
1925 	} else
1926 		bsize = 0;	/* silence gcc */
1927 	VOP_UNLOCK(vp, 0);
1928 	VFS_UNLOCK_GIANT(vfslocked);
1929 	if (obj == NULL) {
1930 		error = EINVAL;
1931 		goto out;
1932 	}
1933 	if (uap->offset < 0) {
1934 		error = EINVAL;
1935 		goto out;
1936 	}
1937 
1938 	/*
1939 	 * The socket must be a stream socket and connected.
1940 	 * Remember if it a blocking or non-blocking socket.
1941 	 */
1942 	if ((error = getsock_cap(td->td_proc->p_fd, uap->s, CAP_WRITE,
1943 	    &sock_fp, NULL)) != 0)
1944 		goto out;
1945 	so = sock_fp->f_data;
1946 	if (so->so_type != SOCK_STREAM) {
1947 		error = EINVAL;
1948 		goto out;
1949 	}
1950 	if ((so->so_state & SS_ISCONNECTED) == 0) {
1951 		error = ENOTCONN;
1952 		goto out;
1953 	}
1954 	/*
1955 	 * Do not wait on memory allocations but return ENOMEM for
1956 	 * caller to retry later.
1957 	 * XXX: Experimental.
1958 	 */
1959 	if (uap->flags & SF_MNOWAIT)
1960 		mnw = 1;
1961 
1962 	if (uap->flags & SF_SYNC) {
1963 		sfs = malloc(sizeof *sfs, M_TEMP, M_WAITOK | M_ZERO);
1964 		mtx_init(&sfs->mtx, "sendfile", NULL, MTX_DEF);
1965 		cv_init(&sfs->cv, "sendfile");
1966 	}
1967 
1968 #ifdef MAC
1969 	error = mac_socket_check_send(td->td_ucred, so);
1970 	if (error)
1971 		goto out;
1972 #endif
1973 
1974 	/* If headers are specified copy them into mbufs. */
1975 	if (hdr_uio != NULL) {
1976 		hdr_uio->uio_td = td;
1977 		hdr_uio->uio_rw = UIO_WRITE;
1978 		if (hdr_uio->uio_resid > 0) {
1979 			/*
1980 			 * In FBSD < 5.0 the nbytes to send also included
1981 			 * the header.  If compat is specified subtract the
1982 			 * header size from nbytes.
1983 			 */
1984 			if (compat) {
1985 				if (uap->nbytes > hdr_uio->uio_resid)
1986 					uap->nbytes -= hdr_uio->uio_resid;
1987 				else
1988 					uap->nbytes = 0;
1989 			}
1990 			m = m_uiotombuf(hdr_uio, (mnw ? M_NOWAIT : M_WAITOK),
1991 			    0, 0, 0);
1992 			if (m == NULL) {
1993 				error = mnw ? EAGAIN : ENOBUFS;
1994 				goto out;
1995 			}
1996 			hdrlen = m_length(m, NULL);
1997 		}
1998 	}
1999 
2000 	/*
2001 	 * Protect against multiple writers to the socket.
2002 	 *
2003 	 * XXXRW: Historically this has assumed non-interruptibility, so now
2004 	 * we implement that, but possibly shouldn't.
2005 	 */
2006 	(void)sblock(&so->so_snd, SBL_WAIT | SBL_NOINTR);
2007 
2008 	/*
2009 	 * Loop through the pages of the file, starting with the requested
2010 	 * offset. Get a file page (do I/O if necessary), map the file page
2011 	 * into an sf_buf, attach an mbuf header to the sf_buf, and queue
2012 	 * it on the socket.
2013 	 * This is done in two loops.  The inner loop turns as many pages
2014 	 * as it can, up to available socket buffer space, without blocking
2015 	 * into mbufs to have it bulk delivered into the socket send buffer.
2016 	 * The outer loop checks the state and available space of the socket
2017 	 * and takes care of the overall progress.
2018 	 */
2019 	for (off = uap->offset; ; ) {
2020 		struct mbuf *mtail;
2021 		int loopbytes;
2022 		int space;
2023 		int done;
2024 
2025 		if ((uap->nbytes != 0 && uap->nbytes == fsbytes) ||
2026 		    (uap->nbytes == 0 && va.va_size == fsbytes))
2027 			break;
2028 
2029 		mtail = NULL;
2030 		loopbytes = 0;
2031 		space = 0;
2032 		done = 0;
2033 
2034 		/*
2035 		 * Check the socket state for ongoing connection,
2036 		 * no errors and space in socket buffer.
2037 		 * If space is low allow for the remainder of the
2038 		 * file to be processed if it fits the socket buffer.
2039 		 * Otherwise block in waiting for sufficient space
2040 		 * to proceed, or if the socket is nonblocking, return
2041 		 * to userland with EAGAIN while reporting how far
2042 		 * we've come.
2043 		 * We wait until the socket buffer has significant free
2044 		 * space to do bulk sends.  This makes good use of file
2045 		 * system read ahead and allows packet segmentation
2046 		 * offloading hardware to take over lots of work.  If
2047 		 * we were not careful here we would send off only one
2048 		 * sfbuf at a time.
2049 		 */
2050 		SOCKBUF_LOCK(&so->so_snd);
2051 		if (so->so_snd.sb_lowat < so->so_snd.sb_hiwat / 2)
2052 			so->so_snd.sb_lowat = so->so_snd.sb_hiwat / 2;
2053 retry_space:
2054 		if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
2055 			error = EPIPE;
2056 			SOCKBUF_UNLOCK(&so->so_snd);
2057 			goto done;
2058 		} else if (so->so_error) {
2059 			error = so->so_error;
2060 			so->so_error = 0;
2061 			SOCKBUF_UNLOCK(&so->so_snd);
2062 			goto done;
2063 		}
2064 		space = sbspace(&so->so_snd);
2065 		if (space < rem &&
2066 		    (space <= 0 ||
2067 		     space < so->so_snd.sb_lowat)) {
2068 			if (so->so_state & SS_NBIO) {
2069 				SOCKBUF_UNLOCK(&so->so_snd);
2070 				error = EAGAIN;
2071 				goto done;
2072 			}
2073 			/*
2074 			 * sbwait drops the lock while sleeping.
2075 			 * When we loop back to retry_space the
2076 			 * state may have changed and we retest
2077 			 * for it.
2078 			 */
2079 			error = sbwait(&so->so_snd);
2080 			/*
2081 			 * An error from sbwait usually indicates that we've
2082 			 * been interrupted by a signal. If we've sent anything
2083 			 * then return bytes sent, otherwise return the error.
2084 			 */
2085 			if (error) {
2086 				SOCKBUF_UNLOCK(&so->so_snd);
2087 				goto done;
2088 			}
2089 			goto retry_space;
2090 		}
2091 		SOCKBUF_UNLOCK(&so->so_snd);
2092 
2093 		/*
2094 		 * Reduce space in the socket buffer by the size of
2095 		 * the header mbuf chain.
2096 		 * hdrlen is set to 0 after the first loop.
2097 		 */
2098 		space -= hdrlen;
2099 
2100 		vfslocked = VFS_LOCK_GIANT(vp->v_mount);
2101 		error = vn_lock(vp, LK_SHARED);
2102 		if (error != 0) {
2103 			VFS_UNLOCK_GIANT(vfslocked);
2104 			goto done;
2105 		}
2106 		error = VOP_GETATTR(vp, &va, td->td_ucred);
2107 		if (error != 0 || off >= va.va_size) {
2108 			VOP_UNLOCK(vp, 0);
2109 			VFS_UNLOCK_GIANT(vfslocked);
2110 			goto done;
2111 		}
2112 		VFS_UNLOCK_GIANT(vfslocked);
2113 
2114 		/*
2115 		 * Loop and construct maximum sized mbuf chain to be bulk
2116 		 * dumped into socket buffer.
2117 		 */
2118 		while (space > loopbytes) {
2119 			vm_pindex_t pindex;
2120 			vm_offset_t pgoff;
2121 			struct mbuf *m0;
2122 
2123 			/*
2124 			 * Calculate the amount to transfer.
2125 			 * Not to exceed a page, the EOF,
2126 			 * or the passed in nbytes.
2127 			 */
2128 			pgoff = (vm_offset_t)(off & PAGE_MASK);
2129 			rem = va.va_size - uap->offset;
2130 			if (uap->nbytes != 0)
2131 				rem = omin(rem, uap->nbytes);
2132 			rem -= fsbytes + loopbytes;
2133 			xfsize = omin(PAGE_SIZE - pgoff, rem);
2134 			xfsize = omin(space - loopbytes, xfsize);
2135 			if (xfsize <= 0) {
2136 				done = 1;		/* all data sent */
2137 				break;
2138 			}
2139 
2140 			/*
2141 			 * Attempt to look up the page.  Allocate
2142 			 * if not found or wait and loop if busy.
2143 			 */
2144 			pindex = OFF_TO_IDX(off);
2145 			VM_OBJECT_LOCK(obj);
2146 			pg = vm_page_grab(obj, pindex, VM_ALLOC_NOBUSY |
2147 			    VM_ALLOC_NORMAL | VM_ALLOC_WIRED | VM_ALLOC_RETRY);
2148 
2149 			/*
2150 			 * Check if page is valid for what we need,
2151 			 * otherwise initiate I/O.
2152 			 * If we already turned some pages into mbufs,
2153 			 * send them off before we come here again and
2154 			 * block.
2155 			 */
2156 			if (pg->valid && vm_page_is_valid(pg, pgoff, xfsize))
2157 				VM_OBJECT_UNLOCK(obj);
2158 			else if (m != NULL)
2159 				error = EAGAIN;	/* send what we already got */
2160 			else if (uap->flags & SF_NODISKIO)
2161 				error = EBUSY;
2162 			else {
2163 				ssize_t resid;
2164 
2165 				VM_OBJECT_UNLOCK(obj);
2166 
2167 				/*
2168 				 * Get the page from backing store.
2169 				 * XXXMAC: Because we don't have fp->f_cred
2170 				 * here, we pass in NOCRED.  This is probably
2171 				 * wrong, but is consistent with our original
2172 				 * implementation.
2173 				 */
2174 				vfslocked = VFS_LOCK_GIANT(vp->v_mount);
2175 				error = vn_rdwr(UIO_READ, vp, NULL, MAXBSIZE,
2176 				    trunc_page(off), UIO_NOCOPY, IO_NODELOCKED |
2177 				    IO_VMIO | ((MAXBSIZE / bsize) << IO_SEQSHIFT),
2178 				    td->td_ucred, NOCRED, &resid, td);
2179 				VFS_UNLOCK_GIANT(vfslocked);
2180 				if (error)
2181 					VM_OBJECT_LOCK(obj);
2182 				mbstat.sf_iocnt++;
2183 			}
2184 			if (error) {
2185 				vm_page_lock(pg);
2186 				vm_page_unwire(pg, 0);
2187 				/*
2188 				 * See if anyone else might know about
2189 				 * this page.  If not and it is not valid,
2190 				 * then free it.
2191 				 */
2192 				if (pg->wire_count == 0 && pg->valid == 0 &&
2193 				    pg->busy == 0 && !(pg->oflags & VPO_BUSY))
2194 					vm_page_free(pg);
2195 				vm_page_unlock(pg);
2196 				VM_OBJECT_UNLOCK(obj);
2197 				if (error == EAGAIN)
2198 					error = 0;	/* not a real error */
2199 				break;
2200 			}
2201 
2202 			/*
2203 			 * Get a sendfile buf.  When allocating the
2204 			 * first buffer for mbuf chain, we usually
2205 			 * wait as long as necessary, but this wait
2206 			 * can be interrupted.  For consequent
2207 			 * buffers, do not sleep, since several
2208 			 * threads might exhaust the buffers and then
2209 			 * deadlock.
2210 			 */
2211 			sf = sf_buf_alloc(pg, (mnw || m != NULL) ? SFB_NOWAIT :
2212 			    SFB_CATCH);
2213 			if (sf == NULL) {
2214 				mbstat.sf_allocfail++;
2215 				vm_page_lock(pg);
2216 				vm_page_unwire(pg, 0);
2217 				KASSERT(pg->object != NULL,
2218 				    ("kern_sendfile: object disappeared"));
2219 				vm_page_unlock(pg);
2220 				if (m == NULL)
2221 					error = (mnw ? EAGAIN : EINTR);
2222 				break;
2223 			}
2224 
2225 			/*
2226 			 * Get an mbuf and set it up as having
2227 			 * external storage.
2228 			 */
2229 			m0 = m_get((mnw ? M_NOWAIT : M_WAITOK), MT_DATA);
2230 			if (m0 == NULL) {
2231 				error = (mnw ? EAGAIN : ENOBUFS);
2232 				sf_buf_mext(NULL, sf);
2233 				break;
2234 			}
2235 			MEXTADD(m0, sf_buf_kva(sf), PAGE_SIZE, sf_buf_mext,
2236 			    sfs, sf, M_RDONLY, EXT_SFBUF);
2237 			m0->m_data = (char *)sf_buf_kva(sf) + pgoff;
2238 			m0->m_len = xfsize;
2239 
2240 			/* Append to mbuf chain. */
2241 			if (mtail != NULL)
2242 				mtail->m_next = m0;
2243 			else if (m != NULL)
2244 				m_last(m)->m_next = m0;
2245 			else
2246 				m = m0;
2247 			mtail = m0;
2248 
2249 			/* Keep track of bits processed. */
2250 			loopbytes += xfsize;
2251 			off += xfsize;
2252 
2253 			if (sfs != NULL) {
2254 				mtx_lock(&sfs->mtx);
2255 				sfs->count++;
2256 				mtx_unlock(&sfs->mtx);
2257 			}
2258 		}
2259 
2260 		VOP_UNLOCK(vp, 0);
2261 
2262 		/* Add the buffer chain to the socket buffer. */
2263 		if (m != NULL) {
2264 			int mlen, err;
2265 
2266 			mlen = m_length(m, NULL);
2267 			SOCKBUF_LOCK(&so->so_snd);
2268 			if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
2269 				error = EPIPE;
2270 				SOCKBUF_UNLOCK(&so->so_snd);
2271 				goto done;
2272 			}
2273 			SOCKBUF_UNLOCK(&so->so_snd);
2274 			CURVNET_SET(so->so_vnet);
2275 			/* Avoid error aliasing. */
2276 			err = (*so->so_proto->pr_usrreqs->pru_send)
2277 				    (so, 0, m, NULL, NULL, td);
2278 			CURVNET_RESTORE();
2279 			if (err == 0) {
2280 				/*
2281 				 * We need two counters to get the
2282 				 * file offset and nbytes to send
2283 				 * right:
2284 				 * - sbytes contains the total amount
2285 				 *   of bytes sent, including headers.
2286 				 * - fsbytes contains the total amount
2287 				 *   of bytes sent from the file.
2288 				 */
2289 				sbytes += mlen;
2290 				fsbytes += mlen;
2291 				if (hdrlen) {
2292 					fsbytes -= hdrlen;
2293 					hdrlen = 0;
2294 				}
2295 			} else if (error == 0)
2296 				error = err;
2297 			m = NULL;	/* pru_send always consumes */
2298 		}
2299 
2300 		/* Quit outer loop on error or when we're done. */
2301 		if (done)
2302 			break;
2303 		if (error)
2304 			goto done;
2305 	}
2306 
2307 	/*
2308 	 * Send trailers. Wimp out and use writev(2).
2309 	 */
2310 	if (trl_uio != NULL) {
2311 		sbunlock(&so->so_snd);
2312 		error = kern_writev(td, uap->s, trl_uio);
2313 		if (error == 0)
2314 			sbytes += td->td_retval[0];
2315 		goto out;
2316 	}
2317 
2318 done:
2319 	sbunlock(&so->so_snd);
2320 out:
2321 	/*
2322 	 * If there was no error we have to clear td->td_retval[0]
2323 	 * because it may have been set by writev.
2324 	 */
2325 	if (error == 0) {
2326 		td->td_retval[0] = 0;
2327 	}
2328 	if (uap->sbytes != NULL) {
2329 		copyout(&sbytes, uap->sbytes, sizeof(off_t));
2330 	}
2331 	if (obj != NULL)
2332 		vm_object_deallocate(obj);
2333 	if (vp != NULL) {
2334 		vfslocked = VFS_LOCK_GIANT(vp->v_mount);
2335 		vrele(vp);
2336 		VFS_UNLOCK_GIANT(vfslocked);
2337 	}
2338 	if (so)
2339 		fdrop(sock_fp, td);
2340 	if (m)
2341 		m_freem(m);
2342 
2343 	if (sfs != NULL) {
2344 		mtx_lock(&sfs->mtx);
2345 		if (sfs->count != 0)
2346 			cv_wait(&sfs->cv, &sfs->mtx);
2347 		KASSERT(sfs->count == 0, ("sendfile sync still busy"));
2348 		cv_destroy(&sfs->cv);
2349 		mtx_destroy(&sfs->mtx);
2350 		free(sfs, M_TEMP);
2351 	}
2352 
2353 	if (error == ERESTART)
2354 		error = EINTR;
2355 
2356 	return (error);
2357 }
2358 
2359 /*
2360  * SCTP syscalls.
2361  * Functionality only compiled in if SCTP is defined in the kernel Makefile,
2362  * otherwise all return EOPNOTSUPP.
2363  * XXX: We should make this loadable one day.
2364  */
2365 int
sys_sctp_peeloff(td,uap)2366 sys_sctp_peeloff(td, uap)
2367 	struct thread *td;
2368 	struct sctp_peeloff_args /* {
2369 		int	sd;
2370 		caddr_t	name;
2371 	} */ *uap;
2372 {
2373 #if (defined(INET) || defined(INET6)) && defined(SCTP)
2374 	struct filedesc *fdp;
2375 	struct file *nfp = NULL;
2376 	int error;
2377 	struct socket *head, *so;
2378 	int fd;
2379 	u_int fflag;
2380 
2381 	fdp = td->td_proc->p_fd;
2382 	AUDIT_ARG_FD(uap->sd);
2383 	error = fgetsock(td, uap->sd, CAP_PEELOFF, &head, &fflag);
2384 	if (error)
2385 		goto done2;
2386 	if (head->so_proto->pr_protocol != IPPROTO_SCTP) {
2387 		error = EOPNOTSUPP;
2388 		goto done;
2389 	}
2390 	error = sctp_can_peel_off(head, (sctp_assoc_t)uap->name);
2391 	if (error)
2392 		goto done;
2393 	/*
2394 	 * At this point we know we do have a assoc to pull
2395 	 * we proceed to get the fd setup. This may block
2396 	 * but that is ok.
2397 	 */
2398 
2399 	error = falloc(td, &nfp, &fd, 0);
2400 	if (error)
2401 		goto done;
2402 	td->td_retval[0] = fd;
2403 
2404 	CURVNET_SET(head->so_vnet);
2405 	so = sonewconn(head, SS_ISCONNECTED);
2406 	if (so == NULL) {
2407 		error = ENOMEM;
2408 		goto noconnection;
2409 	}
2410 	/*
2411 	 * Before changing the flags on the socket, we have to bump the
2412 	 * reference count.  Otherwise, if the protocol calls sofree(),
2413 	 * the socket will be released due to a zero refcount.
2414 	 */
2415         SOCK_LOCK(so);
2416         soref(so);                      /* file descriptor reference */
2417         SOCK_UNLOCK(so);
2418 
2419 	ACCEPT_LOCK();
2420 
2421 	TAILQ_REMOVE(&head->so_comp, so, so_list);
2422 	head->so_qlen--;
2423 	so->so_state |= (head->so_state & SS_NBIO);
2424 	so->so_state &= ~SS_NOFDREF;
2425 	so->so_qstate &= ~SQ_COMP;
2426 	so->so_head = NULL;
2427 	ACCEPT_UNLOCK();
2428 	finit(nfp, fflag, DTYPE_SOCKET, so, &socketops);
2429 	error = sctp_do_peeloff(head, so, (sctp_assoc_t)uap->name);
2430 	if (error)
2431 		goto noconnection;
2432 	if (head->so_sigio != NULL)
2433 		fsetown(fgetown(&head->so_sigio), &so->so_sigio);
2434 
2435 noconnection:
2436 	/*
2437 	 * close the new descriptor, assuming someone hasn't ripped it
2438 	 * out from under us.
2439 	 */
2440 	if (error)
2441 		fdclose(fdp, nfp, fd, td);
2442 
2443 	/*
2444 	 * Release explicitly held references before returning.
2445 	 */
2446 	CURVNET_RESTORE();
2447 done:
2448 	if (nfp != NULL)
2449 		fdrop(nfp, td);
2450 	fputsock(head);
2451 done2:
2452 	return (error);
2453 #else  /* SCTP */
2454 	return (EOPNOTSUPP);
2455 #endif /* SCTP */
2456 }
2457 
2458 int
sys_sctp_generic_sendmsg(td,uap)2459 sys_sctp_generic_sendmsg (td, uap)
2460 	struct thread *td;
2461 	struct sctp_generic_sendmsg_args /* {
2462 		int sd,
2463 		caddr_t msg,
2464 		int mlen,
2465 		caddr_t to,
2466 		__socklen_t tolen,
2467 		struct sctp_sndrcvinfo *sinfo,
2468 		int flags
2469 	} */ *uap;
2470 {
2471 #if (defined(INET) || defined(INET6)) && defined(SCTP)
2472 	struct sctp_sndrcvinfo sinfo, *u_sinfo = NULL;
2473 	struct socket *so;
2474 	struct file *fp = NULL;
2475 	int error = 0, len;
2476 	struct sockaddr *to = NULL;
2477 #ifdef KTRACE
2478 	struct uio *ktruio = NULL;
2479 #endif
2480 	struct uio auio;
2481 	struct iovec iov[1];
2482 	cap_rights_t rights;
2483 
2484 	if (uap->sinfo) {
2485 		error = copyin(uap->sinfo, &sinfo, sizeof (sinfo));
2486 		if (error)
2487 			return (error);
2488 		u_sinfo = &sinfo;
2489 	}
2490 
2491 	rights = CAP_WRITE;
2492 	if (uap->tolen) {
2493 		error = getsockaddr(&to, uap->to, uap->tolen);
2494 		if (error) {
2495 			to = NULL;
2496 			goto sctp_bad2;
2497 		}
2498 		rights |= CAP_CONNECT;
2499 	}
2500 
2501 	AUDIT_ARG_FD(uap->sd);
2502 	error = getsock_cap(td->td_proc->p_fd, uap->sd, rights, &fp, NULL);
2503 	if (error)
2504 		goto sctp_bad;
2505 #ifdef KTRACE
2506 	if (to && (KTRPOINT(td, KTR_STRUCT)))
2507 		ktrsockaddr(to);
2508 #endif
2509 
2510 	iov[0].iov_base = uap->msg;
2511 	iov[0].iov_len = uap->mlen;
2512 
2513 	so = (struct socket *)fp->f_data;
2514 	if (so->so_proto->pr_protocol != IPPROTO_SCTP) {
2515 		error = EOPNOTSUPP;
2516 		goto sctp_bad;
2517 	}
2518 #ifdef MAC
2519 	error = mac_socket_check_send(td->td_ucred, so);
2520 	if (error)
2521 		goto sctp_bad;
2522 #endif /* MAC */
2523 
2524 	auio.uio_iov =  iov;
2525 	auio.uio_iovcnt = 1;
2526 	auio.uio_segflg = UIO_USERSPACE;
2527 	auio.uio_rw = UIO_WRITE;
2528 	auio.uio_td = td;
2529 	auio.uio_offset = 0;			/* XXX */
2530 	auio.uio_resid = 0;
2531 	len = auio.uio_resid = uap->mlen;
2532 	CURVNET_SET(so->so_vnet);
2533 	error = sctp_lower_sosend(so, to, &auio,
2534 		    (struct mbuf *)NULL, (struct mbuf *)NULL,
2535 		    uap->flags, u_sinfo, td);
2536 	CURVNET_RESTORE();
2537 	if (error) {
2538 		if (auio.uio_resid != len && (error == ERESTART ||
2539 		    error == EINTR || error == EWOULDBLOCK))
2540 			error = 0;
2541 		/* Generation of SIGPIPE can be controlled per socket. */
2542 		if (error == EPIPE && !(so->so_options & SO_NOSIGPIPE) &&
2543 		    !(uap->flags & MSG_NOSIGNAL)) {
2544 			PROC_LOCK(td->td_proc);
2545 			tdsignal(td, SIGPIPE);
2546 			PROC_UNLOCK(td->td_proc);
2547 		}
2548 	}
2549 	if (error == 0)
2550 		td->td_retval[0] = len - auio.uio_resid;
2551 #ifdef KTRACE
2552 	if (ktruio != NULL) {
2553 		ktruio->uio_resid = td->td_retval[0];
2554 		ktrgenio(uap->sd, UIO_WRITE, ktruio, error);
2555 	}
2556 #endif /* KTRACE */
2557 sctp_bad:
2558 	if (fp)
2559 		fdrop(fp, td);
2560 sctp_bad2:
2561 	if (to)
2562 		free(to, M_SONAME);
2563 	return (error);
2564 #else  /* SCTP */
2565 	return (EOPNOTSUPP);
2566 #endif /* SCTP */
2567 }
2568 
2569 int
sys_sctp_generic_sendmsg_iov(td,uap)2570 sys_sctp_generic_sendmsg_iov(td, uap)
2571 	struct thread *td;
2572 	struct sctp_generic_sendmsg_iov_args /* {
2573 		int sd,
2574 		struct iovec *iov,
2575 		int iovlen,
2576 		caddr_t to,
2577 		__socklen_t tolen,
2578 		struct sctp_sndrcvinfo *sinfo,
2579 		int flags
2580 	} */ *uap;
2581 {
2582 #if (defined(INET) || defined(INET6)) && defined(SCTP)
2583 	struct sctp_sndrcvinfo sinfo, *u_sinfo = NULL;
2584 	struct socket *so;
2585 	struct file *fp = NULL;
2586 	int error=0, i;
2587 	ssize_t len;
2588 	struct sockaddr *to = NULL;
2589 #ifdef KTRACE
2590 	struct uio *ktruio = NULL;
2591 #endif
2592 	struct uio auio;
2593 	struct iovec *iov, *tiov;
2594 	cap_rights_t rights;
2595 
2596 	if (uap->sinfo) {
2597 		error = copyin(uap->sinfo, &sinfo, sizeof (sinfo));
2598 		if (error)
2599 			return (error);
2600 		u_sinfo = &sinfo;
2601 	}
2602 	rights = CAP_WRITE;
2603 	if (uap->tolen) {
2604 		error = getsockaddr(&to, uap->to, uap->tolen);
2605 		if (error) {
2606 			to = NULL;
2607 			goto sctp_bad2;
2608 		}
2609 		rights |= CAP_CONNECT;
2610 	}
2611 
2612 	AUDIT_ARG_FD(uap->sd);
2613 	error = getsock_cap(td->td_proc->p_fd, uap->sd, rights, &fp, NULL);
2614 	if (error)
2615 		goto sctp_bad1;
2616 
2617 #ifdef COMPAT_FREEBSD32
2618 	if (SV_CURPROC_FLAG(SV_ILP32))
2619 		error = freebsd32_copyiniov((struct iovec32 *)uap->iov,
2620 		    uap->iovlen, &iov, EMSGSIZE);
2621 	else
2622 #endif
2623 		error = copyiniov(uap->iov, uap->iovlen, &iov, EMSGSIZE);
2624 	if (error)
2625 		goto sctp_bad1;
2626 #ifdef KTRACE
2627 	if (to && (KTRPOINT(td, KTR_STRUCT)))
2628 		ktrsockaddr(to);
2629 #endif
2630 
2631 	so = (struct socket *)fp->f_data;
2632 	if (so->so_proto->pr_protocol != IPPROTO_SCTP) {
2633 		error = EOPNOTSUPP;
2634 		goto sctp_bad;
2635 	}
2636 #ifdef MAC
2637 	error = mac_socket_check_send(td->td_ucred, so);
2638 	if (error)
2639 		goto sctp_bad;
2640 #endif /* MAC */
2641 
2642 	auio.uio_iov = iov;
2643 	auio.uio_iovcnt = uap->iovlen;
2644 	auio.uio_segflg = UIO_USERSPACE;
2645 	auio.uio_rw = UIO_WRITE;
2646 	auio.uio_td = td;
2647 	auio.uio_offset = 0;			/* XXX */
2648 	auio.uio_resid = 0;
2649 	tiov = iov;
2650 	for (i = 0; i <uap->iovlen; i++, tiov++) {
2651 		if ((auio.uio_resid += tiov->iov_len) < 0) {
2652 			error = EINVAL;
2653 			goto sctp_bad;
2654 		}
2655 	}
2656 	len = auio.uio_resid;
2657 	CURVNET_SET(so->so_vnet);
2658 	error = sctp_lower_sosend(so, to, &auio,
2659 		    (struct mbuf *)NULL, (struct mbuf *)NULL,
2660 		    uap->flags, u_sinfo, td);
2661 	CURVNET_RESTORE();
2662 	if (error) {
2663 		if (auio.uio_resid != len && (error == ERESTART ||
2664 		    error == EINTR || error == EWOULDBLOCK))
2665 			error = 0;
2666 		/* Generation of SIGPIPE can be controlled per socket */
2667 		if (error == EPIPE && !(so->so_options & SO_NOSIGPIPE) &&
2668 		    !(uap->flags & MSG_NOSIGNAL)) {
2669 			PROC_LOCK(td->td_proc);
2670 			tdsignal(td, SIGPIPE);
2671 			PROC_UNLOCK(td->td_proc);
2672 		}
2673 	}
2674 	if (error == 0)
2675 		td->td_retval[0] = len - auio.uio_resid;
2676 #ifdef KTRACE
2677 	if (ktruio != NULL) {
2678 		ktruio->uio_resid = td->td_retval[0];
2679 		ktrgenio(uap->sd, UIO_WRITE, ktruio, error);
2680 	}
2681 #endif /* KTRACE */
2682 sctp_bad:
2683 	free(iov, M_IOV);
2684 sctp_bad1:
2685 	if (fp)
2686 		fdrop(fp, td);
2687 sctp_bad2:
2688 	if (to)
2689 		free(to, M_SONAME);
2690 	return (error);
2691 #else  /* SCTP */
2692 	return (EOPNOTSUPP);
2693 #endif /* SCTP */
2694 }
2695 
2696 int
sys_sctp_generic_recvmsg(td,uap)2697 sys_sctp_generic_recvmsg(td, uap)
2698 	struct thread *td;
2699 	struct sctp_generic_recvmsg_args /* {
2700 		int sd,
2701 		struct iovec *iov,
2702 		int iovlen,
2703 		struct sockaddr *from,
2704 		__socklen_t *fromlenaddr,
2705 		struct sctp_sndrcvinfo *sinfo,
2706 		int *msg_flags
2707 	} */ *uap;
2708 {
2709 #if (defined(INET) || defined(INET6)) && defined(SCTP)
2710 	uint8_t sockbufstore[256];
2711 	struct uio auio;
2712 	struct iovec *iov, *tiov;
2713 	struct sctp_sndrcvinfo sinfo;
2714 	struct socket *so;
2715 	struct file *fp = NULL;
2716 	struct sockaddr *fromsa;
2717 	int fromlen;
2718 	ssize_t len;
2719 	int i, msg_flags;
2720 	int error = 0;
2721 #ifdef KTRACE
2722 	struct uio *ktruio = NULL;
2723 #endif
2724 
2725 	AUDIT_ARG_FD(uap->sd);
2726 	error = getsock_cap(td->td_proc->p_fd, uap->sd, CAP_READ, &fp, NULL);
2727 	if (error) {
2728 		return (error);
2729 	}
2730 #ifdef COMPAT_FREEBSD32
2731 	if (SV_CURPROC_FLAG(SV_ILP32))
2732 		error = freebsd32_copyiniov((struct iovec32 *)uap->iov,
2733 		    uap->iovlen, &iov, EMSGSIZE);
2734 	else
2735 #endif
2736 		error = copyiniov(uap->iov, uap->iovlen, &iov, EMSGSIZE);
2737 	if (error)
2738 		goto out1;
2739 
2740 	so = fp->f_data;
2741 	if (so->so_proto->pr_protocol != IPPROTO_SCTP) {
2742 		error = EOPNOTSUPP;
2743 		goto out;
2744 	}
2745 #ifdef MAC
2746 	error = mac_socket_check_receive(td->td_ucred, so);
2747 	if (error) {
2748 		goto out;
2749 	}
2750 #endif /* MAC */
2751 
2752 	if (uap->fromlenaddr) {
2753 		error = copyin(uap->fromlenaddr,
2754 		    &fromlen, sizeof (fromlen));
2755 		if (error) {
2756 			goto out;
2757 		}
2758 	} else {
2759 		fromlen = 0;
2760 	}
2761 	if (uap->msg_flags) {
2762 		error = copyin(uap->msg_flags, &msg_flags, sizeof (int));
2763 		if (error) {
2764 			goto out;
2765 		}
2766 	} else {
2767 		msg_flags = 0;
2768 	}
2769 	auio.uio_iov = iov;
2770 	auio.uio_iovcnt = uap->iovlen;
2771   	auio.uio_segflg = UIO_USERSPACE;
2772 	auio.uio_rw = UIO_READ;
2773 	auio.uio_td = td;
2774 	auio.uio_offset = 0;			/* XXX */
2775 	auio.uio_resid = 0;
2776 	tiov = iov;
2777 	for (i = 0; i <uap->iovlen; i++, tiov++) {
2778 		if ((auio.uio_resid += tiov->iov_len) < 0) {
2779 			error = EINVAL;
2780 			goto out;
2781 		}
2782 	}
2783 	len = auio.uio_resid;
2784 	fromsa = (struct sockaddr *)sockbufstore;
2785 
2786 #ifdef KTRACE
2787 	if (KTRPOINT(td, KTR_GENIO))
2788 		ktruio = cloneuio(&auio);
2789 #endif /* KTRACE */
2790 	memset(&sinfo, 0, sizeof(struct sctp_sndrcvinfo));
2791 	CURVNET_SET(so->so_vnet);
2792 	error = sctp_sorecvmsg(so, &auio, (struct mbuf **)NULL,
2793 		    fromsa, fromlen, &msg_flags,
2794 		    (struct sctp_sndrcvinfo *)&sinfo, 1);
2795 	CURVNET_RESTORE();
2796 	if (error) {
2797 		if (auio.uio_resid != len && (error == ERESTART ||
2798 		    error == EINTR || error == EWOULDBLOCK))
2799 			error = 0;
2800 	} else {
2801 		if (uap->sinfo)
2802 			error = copyout(&sinfo, uap->sinfo, sizeof (sinfo));
2803 	}
2804 #ifdef KTRACE
2805 	if (ktruio != NULL) {
2806 		ktruio->uio_resid = len - auio.uio_resid;
2807 		ktrgenio(uap->sd, UIO_READ, ktruio, error);
2808 	}
2809 #endif /* KTRACE */
2810 	if (error)
2811 		goto out;
2812 	td->td_retval[0] = len - auio.uio_resid;
2813 
2814 	if (fromlen && uap->from) {
2815 		len = fromlen;
2816 		if (len <= 0 || fromsa == 0)
2817 			len = 0;
2818 		else {
2819 			len = MIN(len, fromsa->sa_len);
2820 			error = copyout(fromsa, uap->from, (size_t)len);
2821 			if (error)
2822 				goto out;
2823 		}
2824 		error = copyout(&len, uap->fromlenaddr, sizeof (socklen_t));
2825 		if (error) {
2826 			goto out;
2827 		}
2828 	}
2829 #ifdef KTRACE
2830 	if (KTRPOINT(td, KTR_STRUCT))
2831 		ktrsockaddr(fromsa);
2832 #endif
2833 	if (uap->msg_flags) {
2834 		error = copyout(&msg_flags, uap->msg_flags, sizeof (int));
2835 		if (error) {
2836 			goto out;
2837 		}
2838 	}
2839 out:
2840 	free(iov, M_IOV);
2841 out1:
2842 	if (fp)
2843 		fdrop(fp, td);
2844 
2845 	return (error);
2846 #else  /* SCTP */
2847 	return (EOPNOTSUPP);
2848 #endif /* SCTP */
2849 }
2850