aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-10-28 11:26:12 -0400
committerIngo Molnar <mingo@elte.hu>2008-10-28 11:26:12 -0400
commit7a9787e1eba95a166265e6a260cf30af04ef0a99 (patch)
treee730a4565e0318140d2fbd2f0415d18a339d7336 /net/socket.c
parent41b9eb264c8407655db57b60b4457fe1b2ec9977 (diff)
parent0173a3265b228da319ceb9c1ec6a5682fd1b2d92 (diff)
Merge commit 'v2.6.28-rc2' into x86/pci-ioapic-boot-irq-quirks
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c240
1 files changed, 181 insertions, 59 deletions
diff --git a/net/socket.c b/net/socket.c
index 66c4a8cf6db9..2b7a4b5c9b72 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -63,11 +63,13 @@
63#include <linux/file.h> 63#include <linux/file.h>
64#include <linux/net.h> 64#include <linux/net.h>
65#include <linux/interrupt.h> 65#include <linux/interrupt.h>
66#include <linux/thread_info.h>
66#include <linux/rcupdate.h> 67#include <linux/rcupdate.h>
67#include <linux/netdevice.h> 68#include <linux/netdevice.h>
68#include <linux/proc_fs.h> 69#include <linux/proc_fs.h>
69#include <linux/seq_file.h> 70#include <linux/seq_file.h>
70#include <linux/mutex.h> 71#include <linux/mutex.h>
72#include <linux/thread_info.h>
71#include <linux/wanrouter.h> 73#include <linux/wanrouter.h>
72#include <linux/if_bridge.h> 74#include <linux/if_bridge.h>
73#include <linux/if_frad.h> 75#include <linux/if_frad.h>
@@ -90,6 +92,7 @@
90#include <asm/unistd.h> 92#include <asm/unistd.h>
91 93
92#include <net/compat.h> 94#include <net/compat.h>
95#include <net/wext.h>
93 96
94#include <net/sock.h> 97#include <net/sock.h>
95#include <linux/netfilter.h> 98#include <linux/netfilter.h>
@@ -179,9 +182,9 @@ static DEFINE_PER_CPU(int, sockets_in_use) = 0;
179 * invalid addresses -EFAULT is returned. On a success 0 is returned. 182 * invalid addresses -EFAULT is returned. On a success 0 is returned.
180 */ 183 */
181 184
182int move_addr_to_kernel(void __user *uaddr, int ulen, void *kaddr) 185int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr)
183{ 186{
184 if (ulen < 0 || ulen > MAX_SOCK_ADDR) 187 if (ulen < 0 || ulen > sizeof(struct sockaddr_storage))
185 return -EINVAL; 188 return -EINVAL;
186 if (ulen == 0) 189 if (ulen == 0)
187 return 0; 190 return 0;
@@ -207,7 +210,7 @@ int move_addr_to_kernel(void __user *uaddr, int ulen, void *kaddr)
207 * specified. Zero is returned for a success. 210 * specified. Zero is returned for a success.
208 */ 211 */
209 212
210int move_addr_to_user(void *kaddr, int klen, void __user *uaddr, 213int move_addr_to_user(struct sockaddr *kaddr, int klen, void __user *uaddr,
211 int __user *ulen) 214 int __user *ulen)
212{ 215{
213 int err; 216 int err;
@@ -218,7 +221,7 @@ int move_addr_to_user(void *kaddr, int klen, void __user *uaddr,
218 return err; 221 return err;
219 if (len > klen) 222 if (len > klen)
220 len = klen; 223 len = klen;
221 if (len < 0 || len > MAX_SOCK_ADDR) 224 if (len < 0 || len > sizeof(struct sockaddr_storage))
222 return -EINVAL; 225 return -EINVAL;
223 if (len) { 226 if (len) {
224 if (audit_sockaddr(klen, kaddr)) 227 if (audit_sockaddr(klen, kaddr))
@@ -262,7 +265,7 @@ static void sock_destroy_inode(struct inode *inode)
262 container_of(inode, struct socket_alloc, vfs_inode)); 265 container_of(inode, struct socket_alloc, vfs_inode));
263} 266}
264 267
265static void init_once(struct kmem_cache *cachep, void *foo) 268static void init_once(void *foo)
266{ 269{
267 struct socket_alloc *ei = (struct socket_alloc *)foo; 270 struct socket_alloc *ei = (struct socket_alloc *)foo;
268 271
@@ -348,11 +351,11 @@ static struct dentry_operations sockfs_dentry_operations = {
348 * but we take care of internal coherence yet. 351 * but we take care of internal coherence yet.
349 */ 352 */
350 353
351static int sock_alloc_fd(struct file **filep) 354static int sock_alloc_fd(struct file **filep, int flags)
352{ 355{
353 int fd; 356 int fd;
354 357
355 fd = get_unused_fd(); 358 fd = get_unused_fd_flags(flags);
356 if (likely(fd >= 0)) { 359 if (likely(fd >= 0)) {
357 struct file *file = get_empty_filp(); 360 struct file *file = get_empty_filp();
358 361
@@ -366,7 +369,7 @@ static int sock_alloc_fd(struct file **filep)
366 return fd; 369 return fd;
367} 370}
368 371
369static int sock_attach_fd(struct socket *sock, struct file *file) 372static int sock_attach_fd(struct socket *sock, struct file *file, int flags)
370{ 373{
371 struct dentry *dentry; 374 struct dentry *dentry;
372 struct qstr name = { .name = "" }; 375 struct qstr name = { .name = "" };
@@ -388,20 +391,20 @@ static int sock_attach_fd(struct socket *sock, struct file *file)
388 init_file(file, sock_mnt, dentry, FMODE_READ | FMODE_WRITE, 391 init_file(file, sock_mnt, dentry, FMODE_READ | FMODE_WRITE,
389 &socket_file_ops); 392 &socket_file_ops);
390 SOCK_INODE(sock)->i_fop = &socket_file_ops; 393 SOCK_INODE(sock)->i_fop = &socket_file_ops;
391 file->f_flags = O_RDWR; 394 file->f_flags = O_RDWR | (flags & O_NONBLOCK);
392 file->f_pos = 0; 395 file->f_pos = 0;
393 file->private_data = sock; 396 file->private_data = sock;
394 397
395 return 0; 398 return 0;
396} 399}
397 400
398int sock_map_fd(struct socket *sock) 401int sock_map_fd(struct socket *sock, int flags)
399{ 402{
400 struct file *newfile; 403 struct file *newfile;
401 int fd = sock_alloc_fd(&newfile); 404 int fd = sock_alloc_fd(&newfile, flags);
402 405
403 if (likely(fd >= 0)) { 406 if (likely(fd >= 0)) {
404 int err = sock_attach_fd(sock, newfile); 407 int err = sock_attach_fd(sock, newfile, flags);
405 408
406 if (unlikely(err < 0)) { 409 if (unlikely(err < 0)) {
407 put_filp(newfile); 410 put_filp(newfile);
@@ -1139,7 +1142,7 @@ static int __sock_create(struct net *net, int family, int type, int protocol,
1139 1142
1140 sock->type = type; 1143 sock->type = type;
1141 1144
1142#if defined(CONFIG_KMOD) 1145#ifdef CONFIG_MODULES
1143 /* Attempt to load a protocol module if the find failed. 1146 /* Attempt to load a protocol module if the find failed.
1144 * 1147 *
1145 * 12/09/1996 Marcin: But! this makes REALLY only sense, if the user 1148 * 12/09/1996 Marcin: But! this makes REALLY only sense, if the user
@@ -1217,12 +1220,27 @@ asmlinkage long sys_socket(int family, int type, int protocol)
1217{ 1220{
1218 int retval; 1221 int retval;
1219 struct socket *sock; 1222 struct socket *sock;
1223 int flags;
1224
1225 /* Check the SOCK_* constants for consistency. */
1226 BUILD_BUG_ON(SOCK_CLOEXEC != O_CLOEXEC);
1227 BUILD_BUG_ON((SOCK_MAX | SOCK_TYPE_MASK) != SOCK_TYPE_MASK);
1228 BUILD_BUG_ON(SOCK_CLOEXEC & SOCK_TYPE_MASK);
1229 BUILD_BUG_ON(SOCK_NONBLOCK & SOCK_TYPE_MASK);
1230
1231 flags = type & ~SOCK_TYPE_MASK;
1232 if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1233 return -EINVAL;
1234 type &= SOCK_TYPE_MASK;
1235
1236 if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1237 flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1220 1238
1221 retval = sock_create(family, type, protocol, &sock); 1239 retval = sock_create(family, type, protocol, &sock);
1222 if (retval < 0) 1240 if (retval < 0)
1223 goto out; 1241 goto out;
1224 1242
1225 retval = sock_map_fd(sock); 1243 retval = sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
1226 if (retval < 0) 1244 if (retval < 0)
1227 goto out_release; 1245 goto out_release;
1228 1246
@@ -1245,6 +1263,15 @@ asmlinkage long sys_socketpair(int family, int type, int protocol,
1245 struct socket *sock1, *sock2; 1263 struct socket *sock1, *sock2;
1246 int fd1, fd2, err; 1264 int fd1, fd2, err;
1247 struct file *newfile1, *newfile2; 1265 struct file *newfile1, *newfile2;
1266 int flags;
1267
1268 flags = type & ~SOCK_TYPE_MASK;
1269 if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1270 return -EINVAL;
1271 type &= SOCK_TYPE_MASK;
1272
1273 if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1274 flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1248 1275
1249 /* 1276 /*
1250 * Obtain the first socket and check if the underlying protocol 1277 * Obtain the first socket and check if the underlying protocol
@@ -1263,13 +1290,13 @@ asmlinkage long sys_socketpair(int family, int type, int protocol,
1263 if (err < 0) 1290 if (err < 0)
1264 goto out_release_both; 1291 goto out_release_both;
1265 1292
1266 fd1 = sock_alloc_fd(&newfile1); 1293 fd1 = sock_alloc_fd(&newfile1, flags & O_CLOEXEC);
1267 if (unlikely(fd1 < 0)) { 1294 if (unlikely(fd1 < 0)) {
1268 err = fd1; 1295 err = fd1;
1269 goto out_release_both; 1296 goto out_release_both;
1270 } 1297 }
1271 1298
1272 fd2 = sock_alloc_fd(&newfile2); 1299 fd2 = sock_alloc_fd(&newfile2, flags & O_CLOEXEC);
1273 if (unlikely(fd2 < 0)) { 1300 if (unlikely(fd2 < 0)) {
1274 err = fd2; 1301 err = fd2;
1275 put_filp(newfile1); 1302 put_filp(newfile1);
@@ -1277,12 +1304,12 @@ asmlinkage long sys_socketpair(int family, int type, int protocol,
1277 goto out_release_both; 1304 goto out_release_both;
1278 } 1305 }
1279 1306
1280 err = sock_attach_fd(sock1, newfile1); 1307 err = sock_attach_fd(sock1, newfile1, flags & O_NONBLOCK);
1281 if (unlikely(err < 0)) { 1308 if (unlikely(err < 0)) {
1282 goto out_fd2; 1309 goto out_fd2;
1283 } 1310 }
1284 1311
1285 err = sock_attach_fd(sock2, newfile2); 1312 err = sock_attach_fd(sock2, newfile2, flags & O_NONBLOCK);
1286 if (unlikely(err < 0)) { 1313 if (unlikely(err < 0)) {
1287 fput(newfile1); 1314 fput(newfile1);
1288 goto out_fd1; 1315 goto out_fd1;
@@ -1341,20 +1368,20 @@ out_fd:
1341asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen) 1368asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
1342{ 1369{
1343 struct socket *sock; 1370 struct socket *sock;
1344 char address[MAX_SOCK_ADDR]; 1371 struct sockaddr_storage address;
1345 int err, fput_needed; 1372 int err, fput_needed;
1346 1373
1347 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1374 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1348 if (sock) { 1375 if (sock) {
1349 err = move_addr_to_kernel(umyaddr, addrlen, address); 1376 err = move_addr_to_kernel(umyaddr, addrlen, (struct sockaddr *)&address);
1350 if (err >= 0) { 1377 if (err >= 0) {
1351 err = security_socket_bind(sock, 1378 err = security_socket_bind(sock,
1352 (struct sockaddr *)address, 1379 (struct sockaddr *)&address,
1353 addrlen); 1380 addrlen);
1354 if (!err) 1381 if (!err)
1355 err = sock->ops->bind(sock, 1382 err = sock->ops->bind(sock,
1356 (struct sockaddr *) 1383 (struct sockaddr *)
1357 address, addrlen); 1384 &address, addrlen);
1358 } 1385 }
1359 fput_light(sock->file, fput_needed); 1386 fput_light(sock->file, fput_needed);
1360 } 1387 }
@@ -1400,13 +1427,19 @@ asmlinkage long sys_listen(int fd, int backlog)
1400 * clean when we restucture accept also. 1427 * clean when we restucture accept also.
1401 */ 1428 */
1402 1429
1403asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, 1430long do_accept(int fd, struct sockaddr __user *upeer_sockaddr,
1404 int __user *upeer_addrlen) 1431 int __user *upeer_addrlen, int flags)
1405{ 1432{
1406 struct socket *sock, *newsock; 1433 struct socket *sock, *newsock;
1407 struct file *newfile; 1434 struct file *newfile;
1408 int err, len, newfd, fput_needed; 1435 int err, len, newfd, fput_needed;
1409 char address[MAX_SOCK_ADDR]; 1436 struct sockaddr_storage address;
1437
1438 if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1439 return -EINVAL;
1440
1441 if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1442 flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1410 1443
1411 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1444 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1412 if (!sock) 1445 if (!sock)
@@ -1425,14 +1458,14 @@ asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,
1425 */ 1458 */
1426 __module_get(newsock->ops->owner); 1459 __module_get(newsock->ops->owner);
1427 1460
1428 newfd = sock_alloc_fd(&newfile); 1461 newfd = sock_alloc_fd(&newfile, flags & O_CLOEXEC);
1429 if (unlikely(newfd < 0)) { 1462 if (unlikely(newfd < 0)) {
1430 err = newfd; 1463 err = newfd;
1431 sock_release(newsock); 1464 sock_release(newsock);
1432 goto out_put; 1465 goto out_put;
1433 } 1466 }
1434 1467
1435 err = sock_attach_fd(newsock, newfile); 1468 err = sock_attach_fd(newsock, newfile, flags & O_NONBLOCK);
1436 if (err < 0) 1469 if (err < 0)
1437 goto out_fd_simple; 1470 goto out_fd_simple;
1438 1471
@@ -1445,13 +1478,13 @@ asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,
1445 goto out_fd; 1478 goto out_fd;
1446 1479
1447 if (upeer_sockaddr) { 1480 if (upeer_sockaddr) {
1448 if (newsock->ops->getname(newsock, (struct sockaddr *)address, 1481 if (newsock->ops->getname(newsock, (struct sockaddr *)&address,
1449 &len, 2) < 0) { 1482 &len, 2) < 0) {
1450 err = -ECONNABORTED; 1483 err = -ECONNABORTED;
1451 goto out_fd; 1484 goto out_fd;
1452 } 1485 }
1453 err = move_addr_to_user(address, len, upeer_sockaddr, 1486 err = move_addr_to_user((struct sockaddr *)&address,
1454 upeer_addrlen); 1487 len, upeer_sockaddr, upeer_addrlen);
1455 if (err < 0) 1488 if (err < 0)
1456 goto out_fd; 1489 goto out_fd;
1457 } 1490 }
@@ -1478,6 +1511,68 @@ out_fd:
1478 goto out_put; 1511 goto out_put;
1479} 1512}
1480 1513
1514#if 0
1515#ifdef HAVE_SET_RESTORE_SIGMASK
1516asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
1517 int __user *upeer_addrlen,
1518 const sigset_t __user *sigmask,
1519 size_t sigsetsize, int flags)
1520{
1521 sigset_t ksigmask, sigsaved;
1522 int ret;
1523
1524 if (sigmask) {
1525 /* XXX: Don't preclude handling different sized sigset_t's. */
1526 if (sigsetsize != sizeof(sigset_t))
1527 return -EINVAL;
1528 if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask)))
1529 return -EFAULT;
1530
1531 sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP));
1532 sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
1533 }
1534
1535 ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags);
1536
1537 if (ret < 0 && signal_pending(current)) {
1538 /*
1539 * Don't restore the signal mask yet. Let do_signal() deliver
1540 * the signal on the way back to userspace, before the signal
1541 * mask is restored.
1542 */
1543 if (sigmask) {
1544 memcpy(&current->saved_sigmask, &sigsaved,
1545 sizeof(sigsaved));
1546 set_restore_sigmask();
1547 }
1548 } else if (sigmask)
1549 sigprocmask(SIG_SETMASK, &sigsaved, NULL);
1550
1551 return ret;
1552}
1553#else
1554asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
1555 int __user *upeer_addrlen,
1556 const sigset_t __user *sigmask,
1557 size_t sigsetsize, int flags)
1558{
1559 /* The platform does not support restoring the signal mask in the
1560 * return path. So we do not allow using paccept() with a signal
1561 * mask. */
1562 if (sigmask)
1563 return -EINVAL;
1564
1565 return do_accept(fd, upeer_sockaddr, upeer_addrlen, flags);
1566}
1567#endif
1568#endif
1569
1570asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,
1571 int __user *upeer_addrlen)
1572{
1573 return do_accept(fd, upeer_sockaddr, upeer_addrlen, 0);
1574}
1575
1481/* 1576/*
1482 * Attempt to connect to a socket with the server address. The address 1577 * Attempt to connect to a socket with the server address. The address
1483 * is in user space so we verify it is OK and move it to kernel space. 1578 * is in user space so we verify it is OK and move it to kernel space.
@@ -1494,22 +1589,22 @@ asmlinkage long sys_connect(int fd, struct sockaddr __user *uservaddr,
1494 int addrlen) 1589 int addrlen)
1495{ 1590{
1496 struct socket *sock; 1591 struct socket *sock;
1497 char address[MAX_SOCK_ADDR]; 1592 struct sockaddr_storage address;
1498 int err, fput_needed; 1593 int err, fput_needed;
1499 1594
1500 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1595 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1501 if (!sock) 1596 if (!sock)
1502 goto out; 1597 goto out;
1503 err = move_addr_to_kernel(uservaddr, addrlen, address); 1598 err = move_addr_to_kernel(uservaddr, addrlen, (struct sockaddr *)&address);
1504 if (err < 0) 1599 if (err < 0)
1505 goto out_put; 1600 goto out_put;
1506 1601
1507 err = 1602 err =
1508 security_socket_connect(sock, (struct sockaddr *)address, addrlen); 1603 security_socket_connect(sock, (struct sockaddr *)&address, addrlen);
1509 if (err) 1604 if (err)
1510 goto out_put; 1605 goto out_put;
1511 1606
1512 err = sock->ops->connect(sock, (struct sockaddr *)address, addrlen, 1607 err = sock->ops->connect(sock, (struct sockaddr *)&address, addrlen,
1513 sock->file->f_flags); 1608 sock->file->f_flags);
1514out_put: 1609out_put:
1515 fput_light(sock->file, fput_needed); 1610 fput_light(sock->file, fput_needed);
@@ -1526,7 +1621,7 @@ asmlinkage long sys_getsockname(int fd, struct sockaddr __user *usockaddr,
1526 int __user *usockaddr_len) 1621 int __user *usockaddr_len)
1527{ 1622{
1528 struct socket *sock; 1623 struct socket *sock;
1529 char address[MAX_SOCK_ADDR]; 1624 struct sockaddr_storage address;
1530 int len, err, fput_needed; 1625 int len, err, fput_needed;
1531 1626
1532 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1627 sock = sockfd_lookup_light(fd, &err, &fput_needed);
@@ -1537,10 +1632,10 @@ asmlinkage long sys_getsockname(int fd, struct sockaddr __user *usockaddr,
1537 if (err) 1632 if (err)
1538 goto out_put; 1633 goto out_put;
1539 1634
1540 err = sock->ops->getname(sock, (struct sockaddr *)address, &len, 0); 1635 err = sock->ops->getname(sock, (struct sockaddr *)&address, &len, 0);
1541 if (err) 1636 if (err)
1542 goto out_put; 1637 goto out_put;
1543 err = move_addr_to_user(address, len, usockaddr, usockaddr_len); 1638 err = move_addr_to_user((struct sockaddr *)&address, len, usockaddr, usockaddr_len);
1544 1639
1545out_put: 1640out_put:
1546 fput_light(sock->file, fput_needed); 1641 fput_light(sock->file, fput_needed);
@@ -1557,7 +1652,7 @@ asmlinkage long sys_getpeername(int fd, struct sockaddr __user *usockaddr,
1557 int __user *usockaddr_len) 1652 int __user *usockaddr_len)
1558{ 1653{
1559 struct socket *sock; 1654 struct socket *sock;
1560 char address[MAX_SOCK_ADDR]; 1655 struct sockaddr_storage address;
1561 int len, err, fput_needed; 1656 int len, err, fput_needed;
1562 1657
1563 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1658 sock = sockfd_lookup_light(fd, &err, &fput_needed);
@@ -1569,10 +1664,10 @@ asmlinkage long sys_getpeername(int fd, struct sockaddr __user *usockaddr,
1569 } 1664 }
1570 1665
1571 err = 1666 err =
1572 sock->ops->getname(sock, (struct sockaddr *)address, &len, 1667 sock->ops->getname(sock, (struct sockaddr *)&address, &len,
1573 1); 1668 1);
1574 if (!err) 1669 if (!err)
1575 err = move_addr_to_user(address, len, usockaddr, 1670 err = move_addr_to_user((struct sockaddr *)&address, len, usockaddr,
1576 usockaddr_len); 1671 usockaddr_len);
1577 fput_light(sock->file, fput_needed); 1672 fput_light(sock->file, fput_needed);
1578 } 1673 }
@@ -1590,7 +1685,7 @@ asmlinkage long sys_sendto(int fd, void __user *buff, size_t len,
1590 int addr_len) 1685 int addr_len)
1591{ 1686{
1592 struct socket *sock; 1687 struct socket *sock;
1593 char address[MAX_SOCK_ADDR]; 1688 struct sockaddr_storage address;
1594 int err; 1689 int err;
1595 struct msghdr msg; 1690 struct msghdr msg;
1596 struct iovec iov; 1691 struct iovec iov;
@@ -1609,10 +1704,10 @@ asmlinkage long sys_sendto(int fd, void __user *buff, size_t len,
1609 msg.msg_controllen = 0; 1704 msg.msg_controllen = 0;
1610 msg.msg_namelen = 0; 1705 msg.msg_namelen = 0;
1611 if (addr) { 1706 if (addr) {
1612 err = move_addr_to_kernel(addr, addr_len, address); 1707 err = move_addr_to_kernel(addr, addr_len, (struct sockaddr *)&address);
1613 if (err < 0) 1708 if (err < 0)
1614 goto out_put; 1709 goto out_put;
1615 msg.msg_name = address; 1710 msg.msg_name = (struct sockaddr *)&address;
1616 msg.msg_namelen = addr_len; 1711 msg.msg_namelen = addr_len;
1617 } 1712 }
1618 if (sock->file->f_flags & O_NONBLOCK) 1713 if (sock->file->f_flags & O_NONBLOCK)
@@ -1648,7 +1743,7 @@ asmlinkage long sys_recvfrom(int fd, void __user *ubuf, size_t size,
1648 struct socket *sock; 1743 struct socket *sock;
1649 struct iovec iov; 1744 struct iovec iov;
1650 struct msghdr msg; 1745 struct msghdr msg;
1651 char address[MAX_SOCK_ADDR]; 1746 struct sockaddr_storage address;
1652 int err, err2; 1747 int err, err2;
1653 int fput_needed; 1748 int fput_needed;
1654 1749
@@ -1662,14 +1757,15 @@ asmlinkage long sys_recvfrom(int fd, void __user *ubuf, size_t size,
1662 msg.msg_iov = &iov; 1757 msg.msg_iov = &iov;
1663 iov.iov_len = size; 1758 iov.iov_len = size;
1664 iov.iov_base = ubuf; 1759 iov.iov_base = ubuf;
1665 msg.msg_name = address; 1760 msg.msg_name = (struct sockaddr *)&address;
1666 msg.msg_namelen = MAX_SOCK_ADDR; 1761 msg.msg_namelen = sizeof(address);
1667 if (sock->file->f_flags & O_NONBLOCK) 1762 if (sock->file->f_flags & O_NONBLOCK)
1668 flags |= MSG_DONTWAIT; 1763 flags |= MSG_DONTWAIT;
1669 err = sock_recvmsg(sock, &msg, size, flags); 1764 err = sock_recvmsg(sock, &msg, size, flags);
1670 1765
1671 if (err >= 0 && addr != NULL) { 1766 if (err >= 0 && addr != NULL) {
1672 err2 = move_addr_to_user(address, msg.msg_namelen, addr, addr_len); 1767 err2 = move_addr_to_user((struct sockaddr *)&address,
1768 msg.msg_namelen, addr, addr_len);
1673 if (err2 < 0) 1769 if (err2 < 0)
1674 err = err2; 1770 err = err2;
1675 } 1771 }
@@ -1789,7 +1885,7 @@ asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)
1789 struct compat_msghdr __user *msg_compat = 1885 struct compat_msghdr __user *msg_compat =
1790 (struct compat_msghdr __user *)msg; 1886 (struct compat_msghdr __user *)msg;
1791 struct socket *sock; 1887 struct socket *sock;
1792 char address[MAX_SOCK_ADDR]; 1888 struct sockaddr_storage address;
1793 struct iovec iovstack[UIO_FASTIOV], *iov = iovstack; 1889 struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
1794 unsigned char ctl[sizeof(struct cmsghdr) + 20] 1890 unsigned char ctl[sizeof(struct cmsghdr) + 20]
1795 __attribute__ ((aligned(sizeof(__kernel_size_t)))); 1891 __attribute__ ((aligned(sizeof(__kernel_size_t))));
@@ -1827,9 +1923,13 @@ asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)
1827 1923
1828 /* This will also move the address data into kernel space */ 1924 /* This will also move the address data into kernel space */
1829 if (MSG_CMSG_COMPAT & flags) { 1925 if (MSG_CMSG_COMPAT & flags) {
1830 err = verify_compat_iovec(&msg_sys, iov, address, VERIFY_READ); 1926 err = verify_compat_iovec(&msg_sys, iov,
1927 (struct sockaddr *)&address,
1928 VERIFY_READ);
1831 } else 1929 } else
1832 err = verify_iovec(&msg_sys, iov, address, VERIFY_READ); 1930 err = verify_iovec(&msg_sys, iov,
1931 (struct sockaddr *)&address,
1932 VERIFY_READ);
1833 if (err < 0) 1933 if (err < 0)
1834 goto out_freeiov; 1934 goto out_freeiov;
1835 total_len = err; 1935 total_len = err;
@@ -1900,7 +2000,7 @@ asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg,
1900 int fput_needed; 2000 int fput_needed;
1901 2001
1902 /* kernel mode address */ 2002 /* kernel mode address */
1903 char addr[MAX_SOCK_ADDR]; 2003 struct sockaddr_storage addr;
1904 2004
1905 /* user mode address pointers */ 2005 /* user mode address pointers */
1906 struct sockaddr __user *uaddr; 2006 struct sockaddr __user *uaddr;
@@ -1938,9 +2038,13 @@ asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg,
1938 uaddr = (__force void __user *)msg_sys.msg_name; 2038 uaddr = (__force void __user *)msg_sys.msg_name;
1939 uaddr_len = COMPAT_NAMELEN(msg); 2039 uaddr_len = COMPAT_NAMELEN(msg);
1940 if (MSG_CMSG_COMPAT & flags) { 2040 if (MSG_CMSG_COMPAT & flags) {
1941 err = verify_compat_iovec(&msg_sys, iov, addr, VERIFY_WRITE); 2041 err = verify_compat_iovec(&msg_sys, iov,
2042 (struct sockaddr *)&addr,
2043 VERIFY_WRITE);
1942 } else 2044 } else
1943 err = verify_iovec(&msg_sys, iov, addr, VERIFY_WRITE); 2045 err = verify_iovec(&msg_sys, iov,
2046 (struct sockaddr *)&addr,
2047 VERIFY_WRITE);
1944 if (err < 0) 2048 if (err < 0)
1945 goto out_freeiov; 2049 goto out_freeiov;
1946 total_len = err; 2050 total_len = err;
@@ -1956,7 +2060,8 @@ asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg,
1956 len = err; 2060 len = err;
1957 2061
1958 if (uaddr != NULL) { 2062 if (uaddr != NULL) {
1959 err = move_addr_to_user(addr, msg_sys.msg_namelen, uaddr, 2063 err = move_addr_to_user((struct sockaddr *)&addr,
2064 msg_sys.msg_namelen, uaddr,
1960 uaddr_len); 2065 uaddr_len);
1961 if (err < 0) 2066 if (err < 0)
1962 goto out_freeiov; 2067 goto out_freeiov;
@@ -1988,10 +2093,11 @@ out:
1988 2093
1989/* Argument list sizes for sys_socketcall */ 2094/* Argument list sizes for sys_socketcall */
1990#define AL(x) ((x) * sizeof(unsigned long)) 2095#define AL(x) ((x) * sizeof(unsigned long))
1991static const unsigned char nargs[18]={ 2096static const unsigned char nargs[19]={
1992 AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), 2097 AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
1993 AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), 2098 AL(3),AL(3),AL(4),AL(4),AL(4),AL(6),
1994 AL(6),AL(2),AL(5),AL(5),AL(3),AL(3) 2099 AL(6),AL(2),AL(5),AL(5),AL(3),AL(3),
2100 AL(6)
1995}; 2101};
1996 2102
1997#undef AL 2103#undef AL
@@ -2010,7 +2116,7 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
2010 unsigned long a0, a1; 2116 unsigned long a0, a1;
2011 int err; 2117 int err;
2012 2118
2013 if (call < 1 || call > SYS_RECVMSG) 2119 if (call < 1 || call > SYS_PACCEPT)
2014 return -EINVAL; 2120 return -EINVAL;
2015 2121
2016 /* copy_from_user should be SMP safe. */ 2122 /* copy_from_user should be SMP safe. */
@@ -2039,8 +2145,8 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
2039 break; 2145 break;
2040 case SYS_ACCEPT: 2146 case SYS_ACCEPT:
2041 err = 2147 err =
2042 sys_accept(a0, (struct sockaddr __user *)a1, 2148 do_accept(a0, (struct sockaddr __user *)a1,
2043 (int __user *)a[2]); 2149 (int __user *)a[2], 0);
2044 break; 2150 break;
2045 case SYS_GETSOCKNAME: 2151 case SYS_GETSOCKNAME:
2046 err = 2152 err =
@@ -2087,6 +2193,13 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
2087 case SYS_RECVMSG: 2193 case SYS_RECVMSG:
2088 err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]); 2194 err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]);
2089 break; 2195 break;
2196 case SYS_PACCEPT:
2197 err =
2198 sys_paccept(a0, (struct sockaddr __user *)a1,
2199 (int __user *)a[2],
2200 (const sigset_t __user *) a[3],
2201 a[4], a[5]);
2202 break;
2090 default: 2203 default:
2091 err = -EINVAL; 2204 err = -EINVAL;
2092 break; 2205 break;
@@ -2210,10 +2323,19 @@ static long compat_sock_ioctl(struct file *file, unsigned cmd,
2210{ 2323{
2211 struct socket *sock = file->private_data; 2324 struct socket *sock = file->private_data;
2212 int ret = -ENOIOCTLCMD; 2325 int ret = -ENOIOCTLCMD;
2326 struct sock *sk;
2327 struct net *net;
2328
2329 sk = sock->sk;
2330 net = sock_net(sk);
2213 2331
2214 if (sock->ops->compat_ioctl) 2332 if (sock->ops->compat_ioctl)
2215 ret = sock->ops->compat_ioctl(sock, cmd, arg); 2333 ret = sock->ops->compat_ioctl(sock, cmd, arg);
2216 2334
2335 if (ret == -ENOIOCTLCMD &&
2336 (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST))
2337 ret = compat_wext_handle_ioctl(net, cmd, arg);
2338
2217 return ret; 2339 return ret;
2218} 2340}
2219#endif 2341#endif