Deleted Added
full compact
sctp_syscalls.c (247602) sctp_syscalls.c (247667)
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

--- 19 unchanged lines hidden (view full) ---

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>
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

--- 19 unchanged lines hidden (view full) ---

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: head/sys/kern/uipc_syscalls.c 247602 2013-03-02 00:53:12Z pjd $");
36__FBSDID("$FreeBSD: head/sys/kern/uipc_syscalls.c 247667 2013-03-02 21:11:30Z pjd $");
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

--- 151 unchanged lines hidden (view full) ---

196 int s;
197 caddr_t name;
198 int namelen;
199 } */ *uap;
200{
201 struct sockaddr *sa;
202 int error;
203
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

--- 151 unchanged lines hidden (view full) ---

196 int s;
197 caddr_t name;
198 int namelen;
199 } */ *uap;
200{
201 struct sockaddr *sa;
202 int error;
203
204 if ((error = getsockaddr(&sa, uap->name, uap->namelen)) != 0)
205 return (error);
206
207 error = kern_bind(td, uap->s, sa);
208 free(sa, M_SONAME);
204 error = getsockaddr(&sa, uap->name, uap->namelen);
205 if (error == 0) {
206 error = kern_bind(td, uap->s, sa);
207 free(sa, M_SONAME);
208 }
209 return (error);
210}
211
209 return (error);
210}
211
212int
213kern_bind(td, fd, sa)
214 struct thread *td;
215 int fd;
216 struct sockaddr *sa;
212static int
213kern_bindat(struct thread *td, int dirfd, int fd, struct sockaddr *sa)
217{
218 struct socket *so;
219 struct file *fp;
220 int error;
221
222 AUDIT_ARG_FD(fd);
214{
215 struct socket *so;
216 struct file *fp;
217 int error;
218
219 AUDIT_ARG_FD(fd);
223 AUDIT_ARG_SOCKADDR(td, sa);
220 AUDIT_ARG_SOCKADDR(td, dirfd, sa);
224 error = getsock_cap(td->td_proc->p_fd, fd, CAP_BIND, &fp, NULL);
225 if (error)
226 return (error);
227 so = fp->f_data;
228#ifdef KTRACE
229 if (KTRPOINT(td, KTR_STRUCT))
230 ktrsockaddr(sa);
231#endif
232#ifdef MAC
233 error = mac_socket_check_bind(td->td_ucred, so, sa);
221 error = getsock_cap(td->td_proc->p_fd, fd, CAP_BIND, &fp, NULL);
222 if (error)
223 return (error);
224 so = fp->f_data;
225#ifdef KTRACE
226 if (KTRPOINT(td, KTR_STRUCT))
227 ktrsockaddr(sa);
228#endif
229#ifdef MAC
230 error = mac_socket_check_bind(td->td_ucred, so, sa);
234 if (error == 0)
231 if (error == 0) {
235#endif
232#endif
236 error = sobind(so, sa, td);
233 if (dirfd == AT_FDCWD)
234 error = sobind(so, sa, td);
235 else
236 error = sobindat(dirfd, so, sa, td);
237#ifdef MAC
238 }
239#endif
237 fdrop(fp, td);
238 return (error);
239}
240
240 fdrop(fp, td);
241 return (error);
242}
243
244int
245kern_bind(struct thread *td, int fd, struct sockaddr *sa)
246{
247
248 return (kern_bindat(td, AT_FDCWD, fd, sa));
249}
250
241/* ARGSUSED */
242int
251/* ARGSUSED */
252int
253sys_bindat(td, uap)
254 struct thread *td;
255 struct bindat_args /* {
256 int fd;
257 int s;
258 caddr_t name;
259 int namelen;
260 } */ *uap;
261{
262 struct sockaddr *sa;
263 int error;
264
265 error = getsockaddr(&sa, uap->name, uap->namelen);
266 if (error == 0) {
267 error = kern_bindat(td, uap->fd, uap->s, sa);
268 free(sa, M_SONAME);
269 }
270 return (error);
271}
272
273/* ARGSUSED */
274int
243sys_listen(td, uap)
244 struct thread *td;
245 struct listen_args /* {
246 int s;
247 int backlog;
248 } */ *uap;
249{
250 struct socket *so;

--- 179 unchanged lines hidden (view full) ---

430 *namelen = 0;
431 goto noconnection;
432 }
433 if (sa == NULL) {
434 if (name)
435 *namelen = 0;
436 goto done;
437 }
275sys_listen(td, uap)
276 struct thread *td;
277 struct listen_args /* {
278 int s;
279 int backlog;
280 } */ *uap;
281{
282 struct socket *so;

--- 179 unchanged lines hidden (view full) ---

462 *namelen = 0;
463 goto noconnection;
464 }
465 if (sa == NULL) {
466 if (name)
467 *namelen = 0;
468 goto done;
469 }
438 AUDIT_ARG_SOCKADDR(td, sa);
470 AUDIT_ARG_SOCKADDR(td, AT_FDCWD, sa);
439 if (name) {
440 /* check sa_len before it is destroyed */
441 if (*namelen > sa->sa_len)
442 *namelen = sa->sa_len;
443#ifdef KTRACE
444 if (KTRPOINT(td, KTR_STRUCT))
445 ktrsockaddr(sa);
446#endif

--- 58 unchanged lines hidden (view full) ---

505 caddr_t name;
506 int namelen;
507 } */ *uap;
508{
509 struct sockaddr *sa;
510 int error;
511
512 error = getsockaddr(&sa, uap->name, uap->namelen);
471 if (name) {
472 /* check sa_len before it is destroyed */
473 if (*namelen > sa->sa_len)
474 *namelen = sa->sa_len;
475#ifdef KTRACE
476 if (KTRPOINT(td, KTR_STRUCT))
477 ktrsockaddr(sa);
478#endif

--- 58 unchanged lines hidden (view full) ---

537 caddr_t name;
538 int namelen;
539 } */ *uap;
540{
541 struct sockaddr *sa;
542 int error;
543
544 error = getsockaddr(&sa, uap->name, uap->namelen);
513 if (error)
514 return (error);
515
516 error = kern_connect(td, uap->s, sa);
517 free(sa, M_SONAME);
545 if (error == 0) {
546 error = kern_connect(td, uap->s, sa);
547 free(sa, M_SONAME);
548 }
518 return (error);
519}
520
549 return (error);
550}
551
521
522int
523kern_connect(td, fd, sa)
524 struct thread *td;
525 int fd;
526 struct sockaddr *sa;
552static int
553kern_connectat(struct thread *td, int dirfd, int fd, struct sockaddr *sa)
527{
528 struct socket *so;
529 struct file *fp;
530 int error;
531 int interrupted = 0;
532
533 AUDIT_ARG_FD(fd);
554{
555 struct socket *so;
556 struct file *fp;
557 int error;
558 int interrupted = 0;
559
560 AUDIT_ARG_FD(fd);
534 AUDIT_ARG_SOCKADDR(td, sa);
561 AUDIT_ARG_SOCKADDR(td, dirfd, sa);
535 error = getsock_cap(td->td_proc->p_fd, fd, CAP_CONNECT, &fp, NULL);
536 if (error)
537 return (error);
538 so = fp->f_data;
539 if (so->so_state & SS_ISCONNECTING) {
540 error = EALREADY;
541 goto done1;
542 }
543#ifdef KTRACE
544 if (KTRPOINT(td, KTR_STRUCT))
545 ktrsockaddr(sa);
546#endif
547#ifdef MAC
548 error = mac_socket_check_connect(td->td_ucred, so, sa);
549 if (error)
550 goto bad;
551#endif
562 error = getsock_cap(td->td_proc->p_fd, fd, CAP_CONNECT, &fp, NULL);
563 if (error)
564 return (error);
565 so = fp->f_data;
566 if (so->so_state & SS_ISCONNECTING) {
567 error = EALREADY;
568 goto done1;
569 }
570#ifdef KTRACE
571 if (KTRPOINT(td, KTR_STRUCT))
572 ktrsockaddr(sa);
573#endif
574#ifdef MAC
575 error = mac_socket_check_connect(td->td_ucred, so, sa);
576 if (error)
577 goto bad;
578#endif
552 error = soconnect(so, sa, td);
579 if (dirfd == AT_FDCWD)
580 error = soconnect(so, sa, td);
581 else
582 error = soconnectat(dirfd, so, sa, td);
553 if (error)
554 goto bad;
555 if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
556 error = EINPROGRESS;
557 goto done1;
558 }
559 SOCK_LOCK(so);
560 while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {

--- 16 unchanged lines hidden (view full) ---

577 if (error == ERESTART)
578 error = EINTR;
579done1:
580 fdrop(fp, td);
581 return (error);
582}
583
584int
583 if (error)
584 goto bad;
585 if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
586 error = EINPROGRESS;
587 goto done1;
588 }
589 SOCK_LOCK(so);
590 while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {

--- 16 unchanged lines hidden (view full) ---

607 if (error == ERESTART)
608 error = EINTR;
609done1:
610 fdrop(fp, td);
611 return (error);
612}
613
614int
615kern_connect(struct thread *td, int fd, struct sockaddr *sa)
616{
617
618 return (kern_connectat(td, AT_FDCWD, fd, sa));
619}
620
621/* ARGSUSED */
622int
623sys_connectat(td, uap)
624 struct thread *td;
625 struct connectat_args /* {
626 int fd;
627 int s;
628 caddr_t name;
629 int namelen;
630 } */ *uap;
631{
632 struct sockaddr *sa;
633 int error;
634
635 error = getsockaddr(&sa, uap->name, uap->namelen);
636 if (error == 0) {
637 error = kern_connectat(td, uap->fd, uap->s, sa);
638 free(sa, M_SONAME);
639 }
640 return (error);
641}
642
643int
585kern_socketpair(struct thread *td, int domain, int type, int protocol,
586 int *rsv)
587{
588 struct filedesc *fdp = td->td_proc->p_fd;
589 struct file *fp1, *fp2;
590 struct socket *so1, *so2;
591 int fd, error;
592

--- 151 unchanged lines hidden (view full) ---

744 cap_rights_t rights;
745#ifdef KTRACE
746 struct uio *ktruio = NULL;
747#endif
748
749 AUDIT_ARG_FD(s);
750 rights = CAP_SEND;
751 if (mp->msg_name != NULL) {
644kern_socketpair(struct thread *td, int domain, int type, int protocol,
645 int *rsv)
646{
647 struct filedesc *fdp = td->td_proc->p_fd;
648 struct file *fp1, *fp2;
649 struct socket *so1, *so2;
650 int fd, error;
651

--- 151 unchanged lines hidden (view full) ---

803 cap_rights_t rights;
804#ifdef KTRACE
805 struct uio *ktruio = NULL;
806#endif
807
808 AUDIT_ARG_FD(s);
809 rights = CAP_SEND;
810 if (mp->msg_name != NULL) {
752 AUDIT_ARG_SOCKADDR(td, mp->msg_name);
811 AUDIT_ARG_SOCKADDR(td, AT_FDCWD, mp->msg_name);
753 rights |= CAP_CONNECT;
754 }
755 error = getsock_cap(td->td_proc->p_fd, s, rights, &fp, NULL);
756 if (error)
757 return (error);
758 so = (struct socket *)fp->f_data;
759
760#ifdef KTRACE

--- 231 unchanged lines hidden (view full) ---

992 (mp->msg_control || controlp) ? &control : NULL,
993 &mp->msg_flags);
994 if (error) {
995 if (auio.uio_resid != len && (error == ERESTART ||
996 error == EINTR || error == EWOULDBLOCK))
997 error = 0;
998 }
999 if (fromsa != NULL)
812 rights |= CAP_CONNECT;
813 }
814 error = getsock_cap(td->td_proc->p_fd, s, rights, &fp, NULL);
815 if (error)
816 return (error);
817 so = (struct socket *)fp->f_data;
818
819#ifdef KTRACE

--- 231 unchanged lines hidden (view full) ---

1051 (mp->msg_control || controlp) ? &control : NULL,
1052 &mp->msg_flags);
1053 if (error) {
1054 if (auio.uio_resid != len && (error == ERESTART ||
1055 error == EINTR || error == EWOULDBLOCK))
1056 error = 0;
1057 }
1058 if (fromsa != NULL)
1000 AUDIT_ARG_SOCKADDR(td, fromsa);
1059 AUDIT_ARG_SOCKADDR(td, AT_FDCWD, fromsa);
1001#ifdef KTRACE
1002 if (ktruio != NULL) {
1003 ktruio->uio_resid = len - auio.uio_resid;
1004 ktrgenio(s, UIO_READ, ktruio, error);
1005 }
1006#endif
1007 if (error)
1008 goto out;

--- 1762 unchanged lines hidden ---
1060#ifdef KTRACE
1061 if (ktruio != NULL) {
1062 ktruio->uio_resid = len - auio.uio_resid;
1063 ktrgenio(s, UIO_READ, ktruio, error);
1064 }
1065#endif
1066 if (error)
1067 goto out;

--- 1762 unchanged lines hidden ---