|
@@ -351,20 +351,28 @@ static int afiucv_hs_send(struct iucv_message *imsg, struct sock *sock,
|
|
|
memcpy(&phs_hdr->iucv_hdr, imsg, sizeof(struct iucv_message));
|
|
|
|
|
|
skb->dev = iucv->hs_dev;
|
|
|
- if (!skb->dev)
|
|
|
- return -ENODEV;
|
|
|
- if (!(skb->dev->flags & IFF_UP) || !netif_carrier_ok(skb->dev))
|
|
|
- return -ENETDOWN;
|
|
|
+ if (!skb->dev) {
|
|
|
+ err = -ENODEV;
|
|
|
+ goto err_free;
|
|
|
+ }
|
|
|
+ if (!(skb->dev->flags & IFF_UP) || !netif_carrier_ok(skb->dev)) {
|
|
|
+ err = -ENETDOWN;
|
|
|
+ goto err_free;
|
|
|
+ }
|
|
|
if (skb->len > skb->dev->mtu) {
|
|
|
- if (sock->sk_type == SOCK_SEQPACKET)
|
|
|
- return -EMSGSIZE;
|
|
|
- else
|
|
|
- skb_trim(skb, skb->dev->mtu);
|
|
|
+ if (sock->sk_type == SOCK_SEQPACKET) {
|
|
|
+ err = -EMSGSIZE;
|
|
|
+ goto err_free;
|
|
|
+ }
|
|
|
+ skb_trim(skb, skb->dev->mtu);
|
|
|
}
|
|
|
skb->protocol = cpu_to_be16(ETH_P_AF_IUCV);
|
|
|
nskb = skb_clone(skb, GFP_ATOMIC);
|
|
|
- if (!nskb)
|
|
|
- return -ENOMEM;
|
|
|
+ if (!nskb) {
|
|
|
+ err = -ENOMEM;
|
|
|
+ goto err_free;
|
|
|
+ }
|
|
|
+
|
|
|
skb_queue_tail(&iucv->send_skb_q, nskb);
|
|
|
err = dev_queue_xmit(skb);
|
|
|
if (net_xmit_eval(err)) {
|
|
@@ -375,6 +383,10 @@ static int afiucv_hs_send(struct iucv_message *imsg, struct sock *sock,
|
|
|
WARN_ON(atomic_read(&iucv->msg_recv) < 0);
|
|
|
}
|
|
|
return net_xmit_eval(err);
|
|
|
+
|
|
|
+err_free:
|
|
|
+ kfree_skb(skb);
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static struct sock *__iucv_get_sock_by_name(char *nm)
|
|
@@ -1167,7 +1179,7 @@ static int iucv_sock_sendmsg(struct socket *sock, struct msghdr *msg,
|
|
|
err = afiucv_hs_send(&txmsg, sk, skb, 0);
|
|
|
if (err) {
|
|
|
atomic_dec(&iucv->msg_sent);
|
|
|
- goto fail;
|
|
|
+ goto out;
|
|
|
}
|
|
|
} else { /* Classic VM IUCV transport */
|
|
|
skb_queue_tail(&iucv->send_skb_q, skb);
|