* 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);
fl.oif = np->mcast_oif;
dst = ip6_dst_lookup(sk, &fl);
- if (dst->error)
+ if ((err = dst->error))
goto out;
if (hlimit < 0) {
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);