@@ -482,7 +482,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
482
482
{
483
483
struct iphdr * iph ;
484
484
int room ;
485
- struct icmp_bxm icmp_param ;
485
+ struct icmp_bxm * icmp_param ;
486
486
struct rtable * rt = skb_rtable (skb_in );
487
487
struct ipcm_cookie ipc ;
488
488
struct flowi4 fl4 ;
@@ -558,9 +558,13 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
558
558
}
559
559
}
560
560
561
+ icmp_param = kmalloc (sizeof (* icmp_param ), GFP_ATOMIC );
562
+ if (!icmp_param )
563
+ return ;
564
+
561
565
sk = icmp_xmit_lock (net );
562
566
if (sk == NULL )
563
- return ;
567
+ goto out_free ;
564
568
565
569
/*
566
570
* Construct source address and options.
@@ -586,27 +590,27 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
586
590
IPTOS_PREC_INTERNETCONTROL ) :
587
591
iph -> tos ;
588
592
589
- if (ip_options_echo (& icmp_param . replyopts .opt .opt , skb_in ))
593
+ if (ip_options_echo (& icmp_param -> replyopts .opt .opt , skb_in ))
590
594
goto out_unlock ;
591
595
592
596
593
597
/*
594
598
* Prepare data for ICMP header.
595
599
*/
596
600
597
- icmp_param . data .icmph .type = type ;
598
- icmp_param . data .icmph .code = code ;
599
- icmp_param . data .icmph .un .gateway = info ;
600
- icmp_param . data .icmph .checksum = 0 ;
601
- icmp_param . skb = skb_in ;
602
- icmp_param . offset = skb_network_offset (skb_in );
601
+ icmp_param -> data .icmph .type = type ;
602
+ icmp_param -> data .icmph .code = code ;
603
+ icmp_param -> data .icmph .un .gateway = info ;
604
+ icmp_param -> data .icmph .checksum = 0 ;
605
+ icmp_param -> skb = skb_in ;
606
+ icmp_param -> offset = skb_network_offset (skb_in );
603
607
inet_sk (sk )-> tos = tos ;
604
608
ipc .addr = iph -> saddr ;
605
- ipc .opt = & icmp_param . replyopts .opt ;
609
+ ipc .opt = & icmp_param -> replyopts .opt ;
606
610
ipc .tx_flags = 0 ;
607
611
608
612
rt = icmp_route_lookup (net , & fl4 , skb_in , iph , saddr , tos ,
609
- type , code , & icmp_param );
613
+ type , code , icmp_param );
610
614
if (IS_ERR (rt ))
611
615
goto out_unlock ;
612
616
@@ -618,19 +622,21 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
618
622
room = dst_mtu (& rt -> dst );
619
623
if (room > 576 )
620
624
room = 576 ;
621
- room -= sizeof (struct iphdr ) + icmp_param . replyopts .opt .opt .optlen ;
625
+ room -= sizeof (struct iphdr ) + icmp_param -> replyopts .opt .opt .optlen ;
622
626
room -= sizeof (struct icmphdr );
623
627
624
- icmp_param . data_len = skb_in -> len - icmp_param . offset ;
625
- if (icmp_param . data_len > room )
626
- icmp_param . data_len = room ;
627
- icmp_param . head_len = sizeof (struct icmphdr );
628
+ icmp_param -> data_len = skb_in -> len - icmp_param -> offset ;
629
+ if (icmp_param -> data_len > room )
630
+ icmp_param -> data_len = room ;
631
+ icmp_param -> head_len = sizeof (struct icmphdr );
628
632
629
- icmp_push_reply (& icmp_param , & fl4 , & ipc , & rt );
633
+ icmp_push_reply (icmp_param , & fl4 , & ipc , & rt );
630
634
ende :
631
635
ip_rt_put (rt );
632
636
out_unlock :
633
637
icmp_xmit_unlock (sk );
638
+ out_free :
639
+ kfree (icmp_param );
634
640
out :;
635
641
}
636
642
EXPORT_SYMBOL (icmp_send );
0 commit comments