From 6e296c9ff3b5a05bdb1a6d57278d97f7b6e21c14 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Thu, 7 Aug 2003 08:33:37 -0700 Subject: [PATCH] [IPV6]: Make sure errors propagate properly in {udp,raw} sendmsg. --- net/ipv6/ip6_output.c | 1 - net/ipv6/raw.c | 2 +- net/ipv6/udp.c | 13 ++++++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index f382087386162..840d4117d4198 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -209,7 +209,6 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, int seg_len = skb->len; int hlimit; u32 mtu; - int err = 0; if (opt) { int head_room; diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 74537add4f738..c5d193728e753 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -659,7 +659,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg fl.oif = np->mcast_oif; dst = ip6_dst_lookup(sk, &fl); - if (dst->error) + if ((err = dst->error)) goto out; if (hlimit < 0) { diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 962116603cdcf..699cbc866c773 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -811,8 +811,10 @@ static int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg * The socket lock must be held while it's corked. */ lock_sock(sk); - if (likely(up->pending)) + if (likely(up->pending)) { + dst = NULL; goto do_append_data; + } release_sock(sk); } ulen += sizeof(struct udphdr); @@ -929,7 +931,7 @@ static int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg fl.oif = np->mcast_oif; dst = ip6_dst_lookup(sk, &fl); - if (dst->error) + if ((err = dst->error)) goto out; if (hlimit < 0) { @@ -968,9 +970,10 @@ do_append_data: else if (!corkreq) err = udp_v6_push_pending_frames(sk, up); - ip6_dst_store(sk, dst, - !ipv6_addr_cmp(&fl.fl6_dst, &np->daddr) ? - &np->daddr : NULL); + if (dst) + ip6_dst_store(sk, dst, + !ipv6_addr_cmp(&fl.fl6_dst, &np->daddr) ? + &np->daddr : NULL); if (err > 0) err = np->recverr ? net_xmit_errno(err) : 0; release_sock(sk); -- 2.53.0