diff options
Diffstat (limited to 'net/decnet/af_decnet.c')
-rw-r--r-- | net/decnet/af_decnet.c | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index 9647d911f916..a5e3a593e472 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c | |||
@@ -1075,6 +1075,7 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags) | |||
1075 | int err = 0; | 1075 | int err = 0; |
1076 | unsigned char type; | 1076 | unsigned char type; |
1077 | long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); | 1077 | long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); |
1078 | struct dst_entry *dst; | ||
1078 | 1079 | ||
1079 | lock_sock(sk); | 1080 | lock_sock(sk); |
1080 | 1081 | ||
@@ -1102,8 +1103,9 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags) | |||
1102 | } | 1103 | } |
1103 | release_sock(sk); | 1104 | release_sock(sk); |
1104 | 1105 | ||
1105 | dst_release(xchg(&newsk->sk_dst_cache, skb->dst)); | 1106 | dst = skb_dst(skb); |
1106 | skb->dst = NULL; | 1107 | dst_release(xchg(&newsk->sk_dst_cache, dst)); |
1108 | skb_dst_set(skb, NULL); | ||
1107 | 1109 | ||
1108 | DN_SK(newsk)->state = DN_CR; | 1110 | DN_SK(newsk)->state = DN_CR; |
1109 | DN_SK(newsk)->addrrem = cb->src_port; | 1111 | DN_SK(newsk)->addrrem = cb->src_port; |
@@ -1250,14 +1252,8 @@ static int dn_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
1250 | if (skb) { | 1252 | if (skb) { |
1251 | amount = skb->len; | 1253 | amount = skb->len; |
1252 | } else { | 1254 | } else { |
1253 | skb = sk->sk_receive_queue.next; | 1255 | skb_queue_walk(&sk->sk_receive_queue, skb) |
1254 | for (;;) { | ||
1255 | if (skb == | ||
1256 | (struct sk_buff *)&sk->sk_receive_queue) | ||
1257 | break; | ||
1258 | amount += skb->len; | 1256 | amount += skb->len; |
1259 | skb = skb->next; | ||
1260 | } | ||
1261 | } | 1257 | } |
1262 | release_sock(sk); | 1258 | release_sock(sk); |
1263 | err = put_user(amount, (int __user *)arg); | 1259 | err = put_user(amount, (int __user *)arg); |
@@ -1644,13 +1640,13 @@ static int __dn_getsockopt(struct socket *sock, int level,int optname, char __us | |||
1644 | 1640 | ||
1645 | static int dn_data_ready(struct sock *sk, struct sk_buff_head *q, int flags, int target) | 1641 | static int dn_data_ready(struct sock *sk, struct sk_buff_head *q, int flags, int target) |
1646 | { | 1642 | { |
1647 | struct sk_buff *skb = q->next; | 1643 | struct sk_buff *skb; |
1648 | int len = 0; | 1644 | int len = 0; |
1649 | 1645 | ||
1650 | if (flags & MSG_OOB) | 1646 | if (flags & MSG_OOB) |
1651 | return !skb_queue_empty(q) ? 1 : 0; | 1647 | return !skb_queue_empty(q) ? 1 : 0; |
1652 | 1648 | ||
1653 | while(skb != (struct sk_buff *)q) { | 1649 | skb_queue_walk(q, skb) { |
1654 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 1650 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
1655 | len += skb->len; | 1651 | len += skb->len; |
1656 | 1652 | ||
@@ -1666,8 +1662,6 @@ static int dn_data_ready(struct sock *sk, struct sk_buff_head *q, int flags, int | |||
1666 | /* minimum data length for read exceeded */ | 1662 | /* minimum data length for read exceeded */ |
1667 | if (len >= target) | 1663 | if (len >= target) |
1668 | return 1; | 1664 | return 1; |
1669 | |||
1670 | skb = skb->next; | ||
1671 | } | 1665 | } |
1672 | 1666 | ||
1673 | return 0; | 1667 | return 0; |
@@ -1683,7 +1677,7 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1683 | size_t target = size > 1 ? 1 : 0; | 1677 | size_t target = size > 1 ? 1 : 0; |
1684 | size_t copied = 0; | 1678 | size_t copied = 0; |
1685 | int rv = 0; | 1679 | int rv = 0; |
1686 | struct sk_buff *skb, *nskb; | 1680 | struct sk_buff *skb, *n; |
1687 | struct dn_skb_cb *cb = NULL; | 1681 | struct dn_skb_cb *cb = NULL; |
1688 | unsigned char eor = 0; | 1682 | unsigned char eor = 0; |
1689 | long timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); | 1683 | long timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); |
@@ -1758,7 +1752,7 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1758 | finish_wait(sk->sk_sleep, &wait); | 1752 | finish_wait(sk->sk_sleep, &wait); |
1759 | } | 1753 | } |
1760 | 1754 | ||
1761 | for(skb = queue->next; skb != (struct sk_buff *)queue; skb = nskb) { | 1755 | skb_queue_walk_safe(queue, skb, n) { |
1762 | unsigned int chunk = skb->len; | 1756 | unsigned int chunk = skb->len; |
1763 | cb = DN_SKB_CB(skb); | 1757 | cb = DN_SKB_CB(skb); |
1764 | 1758 | ||
@@ -1775,7 +1769,6 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1775 | skb_pull(skb, chunk); | 1769 | skb_pull(skb, chunk); |
1776 | 1770 | ||
1777 | eor = cb->nsp_flags & 0x40; | 1771 | eor = cb->nsp_flags & 0x40; |
1778 | nskb = skb->next; | ||
1779 | 1772 | ||
1780 | if (skb->len == 0) { | 1773 | if (skb->len == 0) { |
1781 | skb_unlink(skb, queue); | 1774 | skb_unlink(skb, queue); |