aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-07-28 18:07:55 -0400
committerIngo Molnar <mingo@elte.hu>2008-07-28 18:07:55 -0400
commitcb28a1bbdb4790378e7366d6c9ee1d2340b84f92 (patch)
tree316436f77dac75335fd2c3ef5f109e71606c50d3 /net/socket.c
parentb6d4f7e3ef25beb8c658c97867d98883e69dc544 (diff)
parentf934fb19ef34730263e6afc01e8ec27a8a71470f (diff)
Merge branch 'linus' into core/generic-dma-coherent
Conflicts: arch/x86/Kconfig Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c236
1 files changed, 178 insertions, 58 deletions
diff --git a/net/socket.c b/net/socket.c
index 66c4a8cf6db9..8ef8ba81b9e2 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);
@@ -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,66 @@ out_fd:
1478 goto out_put; 1511 goto out_put;
1479} 1512}
1480 1513
1514#ifdef HAVE_SET_RESTORE_SIGMASK
1515asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
1516 int __user *upeer_addrlen,
1517 const sigset_t __user *sigmask,
1518 size_t sigsetsize, int flags)
1519{
1520 sigset_t ksigmask, sigsaved;
1521 int ret;
1522
1523 if (sigmask) {
1524 /* XXX: Don't preclude handling different sized sigset_t's. */
1525 if (sigsetsize != sizeof(sigset_t))
1526 return -EINVAL;
1527 if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask)))
1528 return -EFAULT;
1529
1530 sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP));
1531 sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
1532 }
1533
1534 ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags);
1535
1536 if (ret < 0 && signal_pending(current)) {
1537 /*
1538 * Don't restore the signal mask yet. Let do_signal() deliver
1539 * the signal on the way back to userspace, before the signal
1540 * mask is restored.
1541 */
1542 if (sigmask) {
1543 memcpy(&current->saved_sigmask, &sigsaved,
1544 sizeof(sigsaved));
1545 set_restore_sigmask();
1546 }
1547 } else if (sigmask)
1548 sigprocmask(SIG_SETMASK, &sigsaved, NULL);
1549
1550 return ret;
1551}
1552#else
1553asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
1554 int __user *upeer_addrlen,
1555 const sigset_t __user *sigmask,
1556 size_t sigsetsize, int flags)
1557{
1558 /* The platform does not support restoring the signal mask in the
1559 * return path. So we do not allow using paccept() with a signal
1560 * mask. */
1561 if (sigmask)
1562 return -EINVAL;
1563
1564 return do_accept(fd, upeer_sockaddr, upeer_addrlen, flags);
1565}
1566#endif
1567
1568asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,
1569 int __user *upeer_addrlen)
1570{
1571 return do_accept(fd, upeer_sockaddr, upeer_addrlen, 0);
1572}
1573
1481/* 1574/*
1482 * Attempt to connect to a socket with the server address. The address 1575 * 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. 1576 * is in user space so we verify it is OK and move it to kernel space.
@@ -1494,22 +1587,22 @@ asmlinkage long sys_connect(int fd, struct sockaddr __user *uservaddr,
1494 int addrlen) 1587 int addrlen)
1495{ 1588{
1496 struct socket *sock; 1589 struct socket *sock;
1497 char address[MAX_SOCK_ADDR]; 1590 struct sockaddr_storage address;
1498 int err, fput_needed; 1591 int err, fput_needed;
1499 1592
1500 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1593 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1501 if (!sock) 1594 if (!sock)
1502 goto out; 1595 goto out;
1503 err = move_addr_to_kernel(uservaddr, addrlen, address); 1596 err = move_addr_to_kernel(uservaddr, addrlen, (struct sockaddr *)&address);
1504 if (err < 0) 1597 if (err < 0)
1505 goto out_put; 1598 goto out_put;
1506 1599
1507 err = 1600 err =
1508 security_socket_connect(sock, (struct sockaddr *)address, addrlen); 1601 security_socket_connect(sock, (struct sockaddr *)&address, addrlen);
1509 if (err) 1602 if (err)
1510 goto out_put; 1603 goto out_put;
1511 1604
1512 err = sock->ops->connect(sock, (struct sockaddr *)address, addrlen, 1605 err = sock->ops->connect(sock, (struct sockaddr *)&address, addrlen,
1513 sock->file->f_flags); 1606 sock->file->f_flags);
1514out_put: 1607out_put:
1515 fput_light(sock->file, fput_needed); 1608 fput_light(sock->file, fput_needed);
@@ -1526,7 +1619,7 @@ asmlinkage long sys_getsockname(int fd, struct sockaddr __user *usockaddr,
1526 int __user *usockaddr_len) 1619 int __user *usockaddr_len)
1527{ 1620{
1528 struct socket *sock; 1621 struct socket *sock;
1529 char address[MAX_SOCK_ADDR]; 1622 struct sockaddr_storage address;
1530 int len, err, fput_needed; 1623 int len, err, fput_needed;
1531 1624
1532 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1625 sock = sockfd_lookup_light(fd, &err, &fput_needed);
@@ -1537,10 +1630,10 @@ asmlinkage long sys_getsockname(int fd, struct sockaddr __user *usockaddr,
1537 if (err) 1630 if (err)
1538 goto out_put; 1631 goto out_put;
1539 1632
1540 err = sock->ops->getname(sock, (struct sockaddr *)address, &len, 0); 1633 err = sock->ops->getname(sock, (struct sockaddr *)&address, &len, 0);
1541 if (err) 1634 if (err)
1542 goto out_put; 1635 goto out_put;
1543 err = move_addr_to_user(address, len, usockaddr, usockaddr_len); 1636 err = move_addr_to_user((struct sockaddr *)&address, len, usockaddr, usockaddr_len);
1544 1637
1545out_put: 1638out_put:
1546 fput_light(sock->file, fput_needed); 1639 fput_light(sock->file, fput_needed);
@@ -1557,7 +1650,7 @@ asmlinkage long sys_getpeername(int fd, struct sockaddr __user *usockaddr,
1557 int __user *usockaddr_len) 1650 int __user *usockaddr_len)
1558{ 1651{
1559 struct socket *sock; 1652 struct socket *sock;
1560 char address[MAX_SOCK_ADDR]; 1653 struct sockaddr_storage address;
1561 int len, err, fput_needed; 1654 int len, err, fput_needed;
1562 1655
1563 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1656 sock = sockfd_lookup_light(fd, &err, &fput_needed);
@@ -1569,10 +1662,10 @@ asmlinkage long sys_getpeername(int fd, struct sockaddr __user *usockaddr,
1569 } 1662 }
1570 1663
1571 err = 1664 err =
1572 sock->ops->getname(sock, (struct sockaddr *)address, &len, 1665 sock->ops->getname(sock, (struct sockaddr *)&address, &len,
1573 1); 1666 1);
1574 if (!err) 1667 if (!err)
1575 err = move_addr_to_user(address, len, usockaddr, 1668 err = move_addr_to_user((struct sockaddr *)&address, len, usockaddr,
1576 usockaddr_len); 1669 usockaddr_len);
1577 fput_light(sock->file, fput_needed); 1670 fput_light(sock->file, fput_needed);
1578 } 1671 }
@@ -1590,7 +1683,7 @@ asmlinkage long sys_sendto(int fd, void __user *buff, size_t len,
1590 int addr_len) 1683 int addr_len)
1591{ 1684{
1592 struct socket *sock; 1685 struct socket *sock;
1593 char address[MAX_SOCK_ADDR]; 1686 struct sockaddr_storage address;
1594 int err; 1687 int err;
1595 struct msghdr msg; 1688 struct msghdr msg;
1596 struct iovec iov; 1689 struct iovec iov;
@@ -1609,10 +1702,10 @@ asmlinkage long sys_sendto(int fd, void __user *buff, size_t len,
1609 msg.msg_controllen = 0; 1702 msg.msg_controllen = 0;
1610 msg.msg_namelen = 0; 1703 msg.msg_namelen = 0;
1611 if (addr) { 1704 if (addr) {
1612 err = move_addr_to_kernel(addr, addr_len, address); 1705 err = move_addr_to_kernel(addr, addr_len, (struct sockaddr *)&address);
1613 if (err < 0) 1706 if (err < 0)
1614 goto out_put; 1707 goto out_put;
1615 msg.msg_name = address; 1708 msg.msg_name = (struct sockaddr *)&address;
1616 msg.msg_namelen = addr_len; 1709 msg.msg_namelen = addr_len;
1617 } 1710 }
1618 if (sock->file->f_flags & O_NONBLOCK) 1711 if (sock->file->f_flags & O_NONBLOCK)
@@ -1648,7 +1741,7 @@ asmlinkage long sys_recvfrom(int fd, void __user *ubuf, size_t size,
1648 struct socket *sock; 1741 struct socket *sock;
1649 struct iovec iov; 1742 struct iovec iov;
1650 struct msghdr msg; 1743 struct msghdr msg;
1651 char address[MAX_SOCK_ADDR]; 1744 struct sockaddr_storage address;
1652 int err, err2; 1745 int err, err2;
1653 int fput_needed; 1746 int fput_needed;
1654 1747
@@ -1662,14 +1755,15 @@ asmlinkage long sys_recvfrom(int fd, void __user *ubuf, size_t size,
1662 msg.msg_iov = &iov; 1755 msg.msg_iov = &iov;
1663 iov.iov_len = size; 1756 iov.iov_len = size;
1664 iov.iov_base = ubuf; 1757 iov.iov_base = ubuf;
1665 msg.msg_name = address; 1758 msg.msg_name = (struct sockaddr *)&address;
1666 msg.msg_namelen = MAX_SOCK_ADDR; 1759 msg.msg_namelen = sizeof(address);
1667 if (sock->file->f_flags & O_NONBLOCK) 1760 if (sock->file->f_flags & O_NONBLOCK)
1668 flags |= MSG_DONTWAIT; 1761 flags |= MSG_DONTWAIT;
1669 err = sock_recvmsg(sock, &msg, size, flags); 1762 err = sock_recvmsg(sock, &msg, size, flags);
1670 1763
1671 if (err >= 0 && addr != NULL) { 1764 if (err >= 0 && addr != NULL) {
1672 err2 = move_addr_to_user(address, msg.msg_namelen, addr, addr_len); 1765 err2 = move_addr_to_user((struct sockaddr *)&address,
1766 msg.msg_namelen, addr, addr_len);
1673 if (err2 < 0) 1767 if (err2 < 0)
1674 err = err2; 1768 err = err2;
1675 } 1769 }
@@ -1789,7 +1883,7 @@ asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)
1789 struct compat_msghdr __user *msg_compat = 1883 struct compat_msghdr __user *msg_compat =
1790 (struct compat_msghdr __user *)msg; 1884 (struct compat_msghdr __user *)msg;
1791 struct socket *sock; 1885 struct socket *sock;
1792 char address[MAX_SOCK_ADDR]; 1886 struct sockaddr_storage address;
1793 struct iovec iovstack[UIO_FASTIOV], *iov = iovstack; 1887 struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
1794 unsigned char ctl[sizeof(struct cmsghdr) + 20] 1888 unsigned char ctl[sizeof(struct cmsghdr) + 20]
1795 __attribute__ ((aligned(sizeof(__kernel_size_t)))); 1889 __attribute__ ((aligned(sizeof(__kernel_size_t))));
@@ -1827,9 +1921,13 @@ asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)
1827 1921
1828 /* This will also move the address data into kernel space */ 1922 /* This will also move the address data into kernel space */
1829 if (MSG_CMSG_COMPAT & flags) { 1923 if (MSG_CMSG_COMPAT & flags) {
1830 err = verify_compat_iovec(&msg_sys, iov, address, VERIFY_READ); 1924 err = verify_compat_iovec(&msg_sys, iov,
1925 (struct sockaddr *)&address,
1926 VERIFY_READ);
1831 } else 1927 } else
1832 err = verify_iovec(&msg_sys, iov, address, VERIFY_READ); 1928 err = verify_iovec(&msg_sys, iov,
1929 (struct sockaddr *)&address,
1930 VERIFY_READ);
1833 if (err < 0) 1931 if (err < 0)
1834 goto out_freeiov; 1932 goto out_freeiov;
1835 total_len = err; 1933 total_len = err;
@@ -1900,7 +1998,7 @@ asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg,
1900 int fput_needed; 1998 int fput_needed;
1901 1999
1902 /* kernel mode address */ 2000 /* kernel mode address */
1903 char addr[MAX_SOCK_ADDR]; 2001 struct sockaddr_storage addr;
1904 2002
1905 /* user mode address pointers */ 2003 /* user mode address pointers */
1906 struct sockaddr __user *uaddr; 2004 struct sockaddr __user *uaddr;
@@ -1938,9 +2036,13 @@ asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg,
1938 uaddr = (__force void __user *)msg_sys.msg_name; 2036 uaddr = (__force void __user *)msg_sys.msg_name;
1939 uaddr_len = COMPAT_NAMELEN(msg); 2037 uaddr_len = COMPAT_NAMELEN(msg);
1940 if (MSG_CMSG_COMPAT & flags) { 2038 if (MSG_CMSG_COMPAT & flags) {
1941 err = verify_compat_iovec(&msg_sys, iov, addr, VERIFY_WRITE); 2039 err = verify_compat_iovec(&msg_sys, iov,
2040 (struct sockaddr *)&addr,
2041 VERIFY_WRITE);
1942 } else 2042 } else
1943 err = verify_iovec(&msg_sys, iov, addr, VERIFY_WRITE); 2043 err = verify_iovec(&msg_sys, iov,
2044 (struct sockaddr *)&addr,
2045 VERIFY_WRITE);
1944 if (err < 0) 2046 if (err < 0)
1945 goto out_freeiov; 2047 goto out_freeiov;
1946 total_len = err; 2048 total_len = err;
@@ -1956,7 +2058,8 @@ asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg,
1956 len = err; 2058 len = err;
1957 2059
1958 if (uaddr != NULL) { 2060 if (uaddr != NULL) {
1959 err = move_addr_to_user(addr, msg_sys.msg_namelen, uaddr, 2061 err = move_addr_to_user((struct sockaddr *)&addr,
2062 msg_sys.msg_namelen, uaddr,
1960 uaddr_len); 2063 uaddr_len);
1961 if (err < 0) 2064 if (err < 0)
1962 goto out_freeiov; 2065 goto out_freeiov;
@@ -1988,10 +2091,11 @@ out:
1988 2091
1989/* Argument list sizes for sys_socketcall */ 2092/* Argument list sizes for sys_socketcall */
1990#define AL(x) ((x) * sizeof(unsigned long)) 2093#define AL(x) ((x) * sizeof(unsigned long))
1991static const unsigned char nargs[18]={ 2094static const unsigned char nargs[19]={
1992 AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), 2095 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), 2096 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) 2097 AL(6),AL(2),AL(5),AL(5),AL(3),AL(3),
2098 AL(6)
1995}; 2099};
1996 2100
1997#undef AL 2101#undef AL
@@ -2010,7 +2114,7 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
2010 unsigned long a0, a1; 2114 unsigned long a0, a1;
2011 int err; 2115 int err;
2012 2116
2013 if (call < 1 || call > SYS_RECVMSG) 2117 if (call < 1 || call > SYS_PACCEPT)
2014 return -EINVAL; 2118 return -EINVAL;
2015 2119
2016 /* copy_from_user should be SMP safe. */ 2120 /* copy_from_user should be SMP safe. */
@@ -2039,8 +2143,8 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
2039 break; 2143 break;
2040 case SYS_ACCEPT: 2144 case SYS_ACCEPT:
2041 err = 2145 err =
2042 sys_accept(a0, (struct sockaddr __user *)a1, 2146 do_accept(a0, (struct sockaddr __user *)a1,
2043 (int __user *)a[2]); 2147 (int __user *)a[2], 0);
2044 break; 2148 break;
2045 case SYS_GETSOCKNAME: 2149 case SYS_GETSOCKNAME:
2046 err = 2150 err =
@@ -2087,6 +2191,13 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
2087 case SYS_RECVMSG: 2191 case SYS_RECVMSG:
2088 err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]); 2192 err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]);
2089 break; 2193 break;
2194 case SYS_PACCEPT:
2195 err =
2196 sys_paccept(a0, (struct sockaddr __user *)a1,
2197 (int __user *)a[2],
2198 (const sigset_t __user *) a[3],
2199 a[4], a[5]);
2200 break;
2090 default: 2201 default:
2091 err = -EINVAL; 2202 err = -EINVAL;
2092 break; 2203 break;
@@ -2210,10 +2321,19 @@ static long compat_sock_ioctl(struct file *file, unsigned cmd,
2210{ 2321{
2211 struct socket *sock = file->private_data; 2322 struct socket *sock = file->private_data;
2212 int ret = -ENOIOCTLCMD; 2323 int ret = -ENOIOCTLCMD;
2324 struct sock *sk;
2325 struct net *net;
2326
2327 sk = sock->sk;
2328 net = sock_net(sk);
2213 2329
2214 if (sock->ops->compat_ioctl) 2330 if (sock->ops->compat_ioctl)
2215 ret = sock->ops->compat_ioctl(sock, cmd, arg); 2331 ret = sock->ops->compat_ioctl(sock, cmd, arg);
2216 2332
2333 if (ret == -ENOIOCTLCMD &&
2334 (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST))
2335 ret = compat_wext_handle_ioctl(net, cmd, arg);
2336
2217 return ret; 2337 return ret;
2218} 2338}
2219#endif 2339#endif