uipc_usrreq.c (247602) | uipc_usrreq.c (247667) |
---|---|
1/*- 2 * Copyright (c) 1982, 1986, 1989, 1991, 1993 3 * The Regents of the University of California. 4 * Copyright (c) 2004-2009 Robert N. M. Watson 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 43 unchanged lines hidden (view full) --- 52 * TODO: 53 * RDM 54 * distinguish datagram size limits from flow control limits in SEQPACKET 55 * rethink name space problems 56 * need a proper out-of-band 57 */ 58 59#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1982, 1986, 1989, 1991, 1993 3 * The Regents of the University of California. 4 * Copyright (c) 2004-2009 Robert N. M. Watson 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 43 unchanged lines hidden (view full) --- 52 * TODO: 53 * RDM 54 * distinguish datagram size limits from flow control limits in SEQPACKET 55 * rethink name space problems 56 * need a proper out-of-band 57 */ 58 59#include <sys/cdefs.h> |
60__FBSDID("$FreeBSD: head/sys/kern/uipc_usrreq.c 247602 2013-03-02 00:53:12Z pjd $"); | 60__FBSDID("$FreeBSD: head/sys/kern/uipc_usrreq.c 247667 2013-03-02 21:11:30Z pjd $"); |
61 62#include "opt_ddb.h" 63 64#include <sys/param.h> | 61 62#include "opt_ddb.h" 63 64#include <sys/param.h> |
65#include <sys/capability.h> |
|
65#include <sys/domain.h> 66#include <sys/fcntl.h> 67#include <sys/malloc.h> /* XXX must be before <sys/file.h> */ 68#include <sys/eventhandler.h> 69#include <sys/file.h> 70#include <sys/filedesc.h> 71#include <sys/kernel.h> 72#include <sys/lock.h> --- 193 unchanged lines hidden (view full) --- 266#define UNP_PCB_LOCK(unp) mtx_lock(&(unp)->unp_mtx) 267#define UNP_PCB_UNLOCK(unp) mtx_unlock(&(unp)->unp_mtx) 268#define UNP_PCB_LOCK_ASSERT(unp) mtx_assert(&(unp)->unp_mtx, MA_OWNED) 269 270static int uipc_connect2(struct socket *, struct socket *); 271static int uipc_ctloutput(struct socket *, struct sockopt *); 272static int unp_connect(struct socket *, struct sockaddr *, 273 struct thread *); | 66#include <sys/domain.h> 67#include <sys/fcntl.h> 68#include <sys/malloc.h> /* XXX must be before <sys/file.h> */ 69#include <sys/eventhandler.h> 70#include <sys/file.h> 71#include <sys/filedesc.h> 72#include <sys/kernel.h> 73#include <sys/lock.h> --- 193 unchanged lines hidden (view full) --- 267#define UNP_PCB_LOCK(unp) mtx_lock(&(unp)->unp_mtx) 268#define UNP_PCB_UNLOCK(unp) mtx_unlock(&(unp)->unp_mtx) 269#define UNP_PCB_LOCK_ASSERT(unp) mtx_assert(&(unp)->unp_mtx, MA_OWNED) 270 271static int uipc_connect2(struct socket *, struct socket *); 272static int uipc_ctloutput(struct socket *, struct sockopt *); 273static int unp_connect(struct socket *, struct sockaddr *, 274 struct thread *); |
275static int unp_connectat(int, struct socket *, struct sockaddr *, 276 struct thread *); |
|
274static int unp_connect2(struct socket *so, struct socket *so2, int); 275static void unp_disconnect(struct unpcb *unp, struct unpcb *unp2); 276static void unp_dispose(struct mbuf *); 277static void unp_shutdown(struct unpcb *); 278static void unp_drop(struct unpcb *, int); 279static void unp_gc(__unused void *, int); 280static void unp_scan(struct mbuf *, void (*)(struct file *)); 281static void unp_discard(struct file *); --- 163 unchanged lines hidden (view full) --- 445 panic("uipc_attach"); 446 } 447 UNP_LIST_UNLOCK(); 448 449 return (0); 450} 451 452static int | 277static int unp_connect2(struct socket *so, struct socket *so2, int); 278static void unp_disconnect(struct unpcb *unp, struct unpcb *unp2); 279static void unp_dispose(struct mbuf *); 280static void unp_shutdown(struct unpcb *); 281static void unp_drop(struct unpcb *, int); 282static void unp_gc(__unused void *, int); 283static void unp_scan(struct mbuf *, void (*)(struct file *)); 284static void unp_discard(struct file *); --- 163 unchanged lines hidden (view full) --- 448 panic("uipc_attach"); 449 } 450 UNP_LIST_UNLOCK(); 451 452 return (0); 453} 454 455static int |
453uipc_bind(struct socket *so, struct sockaddr *nam, struct thread *td) | 456uipc_bindat(int fd, struct socket *so, struct sockaddr *nam, struct thread *td) |
454{ 455 struct sockaddr_un *soun = (struct sockaddr_un *)nam; 456 struct vattr vattr; 457 int error, namelen; 458 struct nameidata nd; 459 struct unpcb *unp; 460 struct vnode *vp; 461 struct mount *mp; --- 29 unchanged lines hidden (view full) --- 491 unp->unp_flags |= UNP_BINDING; 492 UNP_PCB_UNLOCK(unp); 493 494 buf = malloc(namelen + 1, M_TEMP, M_WAITOK); 495 bcopy(soun->sun_path, buf, namelen); 496 buf[namelen] = 0; 497 498restart: | 457{ 458 struct sockaddr_un *soun = (struct sockaddr_un *)nam; 459 struct vattr vattr; 460 int error, namelen; 461 struct nameidata nd; 462 struct unpcb *unp; 463 struct vnode *vp; 464 struct mount *mp; --- 29 unchanged lines hidden (view full) --- 494 unp->unp_flags |= UNP_BINDING; 495 UNP_PCB_UNLOCK(unp); 496 497 buf = malloc(namelen + 1, M_TEMP, M_WAITOK); 498 bcopy(soun->sun_path, buf, namelen); 499 buf[namelen] = 0; 500 501restart: |
499 NDINIT(&nd, CREATE, NOFOLLOW | LOCKPARENT | SAVENAME, 500 UIO_SYSSPACE, buf, td); | 502 NDINIT_ATRIGHTS(&nd, CREATE, NOFOLLOW | LOCKPARENT | SAVENAME, 503 UIO_SYSSPACE, buf, fd, CAP_BINDAT, td); |
501/* SHOULD BE ABLE TO ADOPT EXISTING AND wakeup() ALA FIFO's */ 502 error = namei(&nd); 503 if (error) 504 goto error; 505 vp = nd.ni_vp; 506 if (vp != NULL || vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) { 507 NDFREE(&nd, NDF_ONLY_PNBUF); 508 if (nd.ni_dvp == vp) --- 46 unchanged lines hidden (view full) --- 555 UNP_PCB_LOCK(unp); 556 unp->unp_flags &= ~UNP_BINDING; 557 UNP_PCB_UNLOCK(unp); 558 free(buf, M_TEMP); 559 return (error); 560} 561 562static int | 504/* SHOULD BE ABLE TO ADOPT EXISTING AND wakeup() ALA FIFO's */ 505 error = namei(&nd); 506 if (error) 507 goto error; 508 vp = nd.ni_vp; 509 if (vp != NULL || vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) { 510 NDFREE(&nd, NDF_ONLY_PNBUF); 511 if (nd.ni_dvp == vp) --- 46 unchanged lines hidden (view full) --- 558 UNP_PCB_LOCK(unp); 559 unp->unp_flags &= ~UNP_BINDING; 560 UNP_PCB_UNLOCK(unp); 561 free(buf, M_TEMP); 562 return (error); 563} 564 565static int |
566uipc_bind(struct socket *so, struct sockaddr *nam, struct thread *td) 567{ 568 569 return (uipc_bindat(AT_FDCWD, so, nam, td)); 570} 571 572static int |
|
563uipc_connect(struct socket *so, struct sockaddr *nam, struct thread *td) 564{ 565 int error; 566 567 KASSERT(td == curthread, ("uipc_connect: td != curthread")); 568 UNP_LINK_WLOCK(); 569 error = unp_connect(so, nam, td); 570 UNP_LINK_WUNLOCK(); 571 return (error); 572} 573 | 573uipc_connect(struct socket *so, struct sockaddr *nam, struct thread *td) 574{ 575 int error; 576 577 KASSERT(td == curthread, ("uipc_connect: td != curthread")); 578 UNP_LINK_WLOCK(); 579 error = unp_connect(so, nam, td); 580 UNP_LINK_WUNLOCK(); 581 return (error); 582} 583 |
584static int 585uipc_connectat(int fd, struct socket *so, struct sockaddr *nam, 586 struct thread *td) 587{ 588 int error; 589 590 KASSERT(td == curthread, ("uipc_connectat: td != curthread")); 591 UNP_LINK_WLOCK(); 592 error = unp_connectat(fd, so, nam, td); 593 UNP_LINK_WUNLOCK(); 594 return (error); 595} 596 |
|
574static void 575uipc_close(struct socket *so) 576{ 577 struct unpcb *unp, *unp2; 578 579 unp = sotounpcb(so); 580 KASSERT(unp != NULL, ("uipc_close: unp == NULL")); 581 --- 494 unchanged lines hidden (view full) --- 1076 return (0); 1077} 1078 1079static struct pr_usrreqs uipc_usrreqs_dgram = { 1080 .pru_abort = uipc_abort, 1081 .pru_accept = uipc_accept, 1082 .pru_attach = uipc_attach, 1083 .pru_bind = uipc_bind, | 597static void 598uipc_close(struct socket *so) 599{ 600 struct unpcb *unp, *unp2; 601 602 unp = sotounpcb(so); 603 KASSERT(unp != NULL, ("uipc_close: unp == NULL")); 604 --- 494 unchanged lines hidden (view full) --- 1099 return (0); 1100} 1101 1102static struct pr_usrreqs uipc_usrreqs_dgram = { 1103 .pru_abort = uipc_abort, 1104 .pru_accept = uipc_accept, 1105 .pru_attach = uipc_attach, 1106 .pru_bind = uipc_bind, |
1107 .pru_bindat = uipc_bindat, |
|
1084 .pru_connect = uipc_connect, | 1108 .pru_connect = uipc_connect, |
1109 .pru_connectat = uipc_connectat, |
|
1085 .pru_connect2 = uipc_connect2, 1086 .pru_detach = uipc_detach, 1087 .pru_disconnect = uipc_disconnect, 1088 .pru_listen = uipc_listen, 1089 .pru_peeraddr = uipc_peeraddr, 1090 .pru_rcvd = uipc_rcvd, 1091 .pru_send = uipc_send, 1092 .pru_sense = uipc_sense, 1093 .pru_shutdown = uipc_shutdown, 1094 .pru_sockaddr = uipc_sockaddr, 1095 .pru_soreceive = soreceive_dgram, 1096 .pru_close = uipc_close, 1097}; 1098 1099static struct pr_usrreqs uipc_usrreqs_seqpacket = { 1100 .pru_abort = uipc_abort, 1101 .pru_accept = uipc_accept, 1102 .pru_attach = uipc_attach, 1103 .pru_bind = uipc_bind, | 1110 .pru_connect2 = uipc_connect2, 1111 .pru_detach = uipc_detach, 1112 .pru_disconnect = uipc_disconnect, 1113 .pru_listen = uipc_listen, 1114 .pru_peeraddr = uipc_peeraddr, 1115 .pru_rcvd = uipc_rcvd, 1116 .pru_send = uipc_send, 1117 .pru_sense = uipc_sense, 1118 .pru_shutdown = uipc_shutdown, 1119 .pru_sockaddr = uipc_sockaddr, 1120 .pru_soreceive = soreceive_dgram, 1121 .pru_close = uipc_close, 1122}; 1123 1124static struct pr_usrreqs uipc_usrreqs_seqpacket = { 1125 .pru_abort = uipc_abort, 1126 .pru_accept = uipc_accept, 1127 .pru_attach = uipc_attach, 1128 .pru_bind = uipc_bind, |
1129 .pru_bindat = uipc_bindat, |
|
1104 .pru_connect = uipc_connect, | 1130 .pru_connect = uipc_connect, |
1131 .pru_connectat = uipc_connectat, |
|
1105 .pru_connect2 = uipc_connect2, 1106 .pru_detach = uipc_detach, 1107 .pru_disconnect = uipc_disconnect, 1108 .pru_listen = uipc_listen, 1109 .pru_peeraddr = uipc_peeraddr, 1110 .pru_rcvd = uipc_rcvd, 1111 .pru_send = uipc_send, 1112 .pru_sense = uipc_sense, 1113 .pru_shutdown = uipc_shutdown, 1114 .pru_sockaddr = uipc_sockaddr, 1115 .pru_soreceive = soreceive_generic, /* XXX: or...? */ 1116 .pru_close = uipc_close, 1117}; 1118 1119static struct pr_usrreqs uipc_usrreqs_stream = { 1120 .pru_abort = uipc_abort, 1121 .pru_accept = uipc_accept, 1122 .pru_attach = uipc_attach, 1123 .pru_bind = uipc_bind, | 1132 .pru_connect2 = uipc_connect2, 1133 .pru_detach = uipc_detach, 1134 .pru_disconnect = uipc_disconnect, 1135 .pru_listen = uipc_listen, 1136 .pru_peeraddr = uipc_peeraddr, 1137 .pru_rcvd = uipc_rcvd, 1138 .pru_send = uipc_send, 1139 .pru_sense = uipc_sense, 1140 .pru_shutdown = uipc_shutdown, 1141 .pru_sockaddr = uipc_sockaddr, 1142 .pru_soreceive = soreceive_generic, /* XXX: or...? */ 1143 .pru_close = uipc_close, 1144}; 1145 1146static struct pr_usrreqs uipc_usrreqs_stream = { 1147 .pru_abort = uipc_abort, 1148 .pru_accept = uipc_accept, 1149 .pru_attach = uipc_attach, 1150 .pru_bind = uipc_bind, |
1151 .pru_bindat = uipc_bindat, |
|
1124 .pru_connect = uipc_connect, | 1152 .pru_connect = uipc_connect, |
1153 .pru_connectat = uipc_connectat, |
|
1125 .pru_connect2 = uipc_connect2, 1126 .pru_detach = uipc_detach, 1127 .pru_disconnect = uipc_disconnect, 1128 .pru_listen = uipc_listen, 1129 .pru_peeraddr = uipc_peeraddr, 1130 .pru_rcvd = uipc_rcvd, 1131 .pru_send = uipc_send, 1132 .pru_sense = uipc_sense, --- 95 unchanged lines hidden (view full) --- 1228 break; 1229 } 1230 return (error); 1231} 1232 1233static int 1234unp_connect(struct socket *so, struct sockaddr *nam, struct thread *td) 1235{ | 1154 .pru_connect2 = uipc_connect2, 1155 .pru_detach = uipc_detach, 1156 .pru_disconnect = uipc_disconnect, 1157 .pru_listen = uipc_listen, 1158 .pru_peeraddr = uipc_peeraddr, 1159 .pru_rcvd = uipc_rcvd, 1160 .pru_send = uipc_send, 1161 .pru_sense = uipc_sense, --- 95 unchanged lines hidden (view full) --- 1257 break; 1258 } 1259 return (error); 1260} 1261 1262static int 1263unp_connect(struct socket *so, struct sockaddr *nam, struct thread *td) 1264{ |
1265 1266 return (unp_connectat(AT_FDCWD, so, nam, td)); 1267} 1268 1269static int 1270unp_connectat(int fd, struct socket *so, struct sockaddr *nam, 1271 struct thread *td) 1272{ |
|
1236 struct sockaddr_un *soun = (struct sockaddr_un *)nam; 1237 struct vnode *vp; 1238 struct socket *so2, *so3; 1239 struct unpcb *unp, *unp2, *unp3; 1240 int error, len; 1241 struct nameidata nd; 1242 char buf[SOCK_MAXADDRLEN]; 1243 struct sockaddr *sa; --- 16 unchanged lines hidden (view full) --- 1260 UNP_PCB_UNLOCK(unp); 1261 return (EALREADY); 1262 } 1263 UNP_LINK_WUNLOCK(); 1264 unp->unp_flags |= UNP_CONNECTING; 1265 UNP_PCB_UNLOCK(unp); 1266 1267 sa = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK); | 1273 struct sockaddr_un *soun = (struct sockaddr_un *)nam; 1274 struct vnode *vp; 1275 struct socket *so2, *so3; 1276 struct unpcb *unp, *unp2, *unp3; 1277 int error, len; 1278 struct nameidata nd; 1279 char buf[SOCK_MAXADDRLEN]; 1280 struct sockaddr *sa; --- 16 unchanged lines hidden (view full) --- 1297 UNP_PCB_UNLOCK(unp); 1298 return (EALREADY); 1299 } 1300 UNP_LINK_WUNLOCK(); 1301 unp->unp_flags |= UNP_CONNECTING; 1302 UNP_PCB_UNLOCK(unp); 1303 1304 sa = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK); |
1268 NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF, 1269 UIO_SYSSPACE, buf, td); | 1305 NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF, 1306 UIO_SYSSPACE, buf, fd, CAP_CONNECTAT, td); |
1270 error = namei(&nd); 1271 if (error) 1272 vp = NULL; 1273 else 1274 vp = nd.ni_vp; 1275 ASSERT_VOP_LOCKED(vp, "unp_connect"); 1276 NDFREE(&nd, NDF_ONLY_PNBUF); 1277 if (error) --- 1175 unchanged lines hidden --- | 1307 error = namei(&nd); 1308 if (error) 1309 vp = NULL; 1310 else 1311 vp = nd.ni_vp; 1312 ASSERT_VOP_LOCKED(vp, "unp_connect"); 1313 NDFREE(&nd, NDF_ONLY_PNBUF); 1314 if (error) --- 1175 unchanged lines hidden --- |