aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c29
1 files changed, 10 insertions, 19 deletions
diff --git a/net/socket.c b/net/socket.c
index 4e396312f8d5..5f374e1ff526 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -407,24 +407,11 @@ int sock_map_fd(struct socket *sock)
407 407
408static struct socket *sock_from_file(struct file *file, int *err) 408static struct socket *sock_from_file(struct file *file, int *err)
409{ 409{
410 struct inode *inode;
411 struct socket *sock;
412
413 if (file->f_op == &socket_file_ops) 410 if (file->f_op == &socket_file_ops)
414 return file->private_data; /* set in sock_map_fd */ 411 return file->private_data; /* set in sock_map_fd */
415 412
416 inode = file->f_path.dentry->d_inode; 413 *err = -ENOTSOCK;
417 if (!S_ISSOCK(inode->i_mode)) { 414 return NULL;
418 *err = -ENOTSOCK;
419 return NULL;
420 }
421
422 sock = SOCKET_I(inode);
423 if (sock->file != file) {
424 printk(KERN_ERR "socki_lookup: socket file changed!\n");
425 sock->file = file;
426 }
427 return sock;
428} 415}
429 416
430/** 417/**
@@ -1527,8 +1514,9 @@ asmlinkage long sys_sendto(int fd, void __user *buff, size_t len,
1527 struct file *sock_file; 1514 struct file *sock_file;
1528 1515
1529 sock_file = fget_light(fd, &fput_needed); 1516 sock_file = fget_light(fd, &fput_needed);
1517 err = -EBADF;
1530 if (!sock_file) 1518 if (!sock_file)
1531 return -EBADF; 1519 goto out;
1532 1520
1533 sock = sock_from_file(sock_file, &err); 1521 sock = sock_from_file(sock_file, &err);
1534 if (!sock) 1522 if (!sock)
@@ -1555,6 +1543,7 @@ asmlinkage long sys_sendto(int fd, void __user *buff, size_t len,
1555 1543
1556out_put: 1544out_put:
1557 fput_light(sock_file, fput_needed); 1545 fput_light(sock_file, fput_needed);
1546out:
1558 return err; 1547 return err;
1559} 1548}
1560 1549
@@ -1586,12 +1575,13 @@ asmlinkage long sys_recvfrom(int fd, void __user *ubuf, size_t size,
1586 int fput_needed; 1575 int fput_needed;
1587 1576
1588 sock_file = fget_light(fd, &fput_needed); 1577 sock_file = fget_light(fd, &fput_needed);
1578 err = -EBADF;
1589 if (!sock_file) 1579 if (!sock_file)
1590 return -EBADF; 1580 goto out;
1591 1581
1592 sock = sock_from_file(sock_file, &err); 1582 sock = sock_from_file(sock_file, &err);
1593 if (!sock) 1583 if (!sock)
1594 goto out; 1584 goto out_put;
1595 1585
1596 msg.msg_control = NULL; 1586 msg.msg_control = NULL;
1597 msg.msg_controllen = 0; 1587 msg.msg_controllen = 0;
@@ -1610,8 +1600,9 @@ asmlinkage long sys_recvfrom(int fd, void __user *ubuf, size_t size,
1610 if (err2 < 0) 1600 if (err2 < 0)
1611 err = err2; 1601 err = err2;
1612 } 1602 }
1613out: 1603out_put:
1614 fput_light(sock_file, fput_needed); 1604 fput_light(sock_file, fput_needed);
1605out:
1615 return err; 1606 return err;
1616} 1607}
1617 1608