uipc_syscalls.c (247602) | uipc_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 --- |