@@ -351,20 +351,28 @@ static int afiucv_hs_send(struct iucv_message *imsg, struct sock *sock,
351
351
memcpy (& phs_hdr -> iucv_hdr , imsg , sizeof (struct iucv_message ));
352
352
353
353
skb -> dev = iucv -> hs_dev ;
354
- if (!skb -> dev )
355
- return - ENODEV ;
356
- if (!(skb -> dev -> flags & IFF_UP ) || !netif_carrier_ok (skb -> dev ))
357
- return - ENETDOWN ;
354
+ if (!skb -> dev ) {
355
+ err = - ENODEV ;
356
+ goto err_free ;
357
+ }
358
+ if (!(skb -> dev -> flags & IFF_UP ) || !netif_carrier_ok (skb -> dev )) {
359
+ err = - ENETDOWN ;
360
+ goto err_free ;
361
+ }
358
362
if (skb -> len > skb -> dev -> mtu ) {
359
- if (sock -> sk_type == SOCK_SEQPACKET )
360
- return - EMSGSIZE ;
361
- else
362
- skb_trim (skb , skb -> dev -> mtu );
363
+ if (sock -> sk_type == SOCK_SEQPACKET ) {
364
+ err = - EMSGSIZE ;
365
+ goto err_free ;
366
+ }
367
+ skb_trim (skb , skb -> dev -> mtu );
363
368
}
364
369
skb -> protocol = cpu_to_be16 (ETH_P_AF_IUCV );
365
370
nskb = skb_clone (skb , GFP_ATOMIC );
366
- if (!nskb )
367
- return - ENOMEM ;
371
+ if (!nskb ) {
372
+ err = - ENOMEM ;
373
+ goto err_free ;
374
+ }
375
+
368
376
skb_queue_tail (& iucv -> send_skb_q , nskb );
369
377
err = dev_queue_xmit (skb );
370
378
if (net_xmit_eval (err )) {
@@ -375,6 +383,10 @@ static int afiucv_hs_send(struct iucv_message *imsg, struct sock *sock,
375
383
WARN_ON (atomic_read (& iucv -> msg_recv ) < 0 );
376
384
}
377
385
return net_xmit_eval (err );
386
+
387
+ err_free :
388
+ kfree_skb (skb );
389
+ return err ;
378
390
}
379
391
380
392
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,
1167
1179
err = afiucv_hs_send (& txmsg , sk , skb , 0 );
1168
1180
if (err ) {
1169
1181
atomic_dec (& iucv -> msg_sent );
1170
- goto fail ;
1182
+ goto out ;
1171
1183
}
1172
1184
} else { /* Classic VM IUCV transport */
1173
1185
skb_queue_tail (& iucv -> send_skb_q , skb );
@@ -2155,8 +2167,8 @@ static int afiucv_hs_rcv(struct sk_buff *skb, struct net_device *dev,
2155
2167
struct sock * sk ;
2156
2168
struct iucv_sock * iucv ;
2157
2169
struct af_iucv_trans_hdr * trans_hdr ;
2170
+ int err = NET_RX_SUCCESS ;
2158
2171
char nullstring [8 ];
2159
- int err = 0 ;
2160
2172
2161
2173
if (skb -> len < (ETH_HLEN + sizeof (struct af_iucv_trans_hdr ))) {
2162
2174
WARN_ONCE (1 , "AF_IUCV too short skb, len=%d, min=%d" ,
@@ -2254,7 +2266,7 @@ static int afiucv_hs_rcv(struct sk_buff *skb, struct net_device *dev,
2254
2266
err = afiucv_hs_callback_rx (sk , skb );
2255
2267
break ;
2256
2268
default :
2257
- ;
2269
+ kfree_skb ( skb ) ;
2258
2270
}
2259
2271
2260
2272
return err ;
0 commit comments