Re: [PATCH net 3/5] net/sched: fix NULL dereference in the error path of tunnel_key_init()

2018-03-16 Thread Jiri Pirko
Fri, Mar 16, 2018 at 12:00:55AM CET, dcara...@redhat.com wrote:
>when the following command
>
> # tc action add action tunnel_key unset index 100
>
>is run for the first time, and tunnel_key_init() fails to allocate struct
>tcf_tunnel_key_params, tunnel_key_release() dereferences NULL pointers.
>This causes the following error:
>
> BUG: unable to handle kernel NULL pointer dereference at 0010
> IP: tunnel_key_release+0xd/0x40 [act_tunnel_key]
> PGD 800033787067 P4D 800033787067 PUD 74646067 PMD 0
> Oops:  [#1] SMP PTI
> Modules linked in: act_tunnel_key(E) act_csum ip6table_filter ip6_tables 
> iptable_filter binfmt_misc ext4 mbcache jbd2 crct10dif_pclmul crc32_pclmul 
> snd_hda_codec_generic ghash_clmulni_intel snd_hda_intel pcbc snd_hda_codec 
> snd_hda_core snd_hwdep snd_seq aesni_intel snd_seq_device crypto_simd 
> glue_helper snd_pcm cryptd joydev snd_timer pcspkr virtio_balloon snd 
> i2c_piix4 soundcore nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs 
> libcrc32c ata_generic pata_acpi qxl drm_kms_helper syscopyarea sysfillrect 
> sysimgblt fb_sys_fops ttm virtio_net virtio_blk drm virtio_console 
> crc32c_intel ata_piix serio_raw i2c_core virtio_pci libata virtio_ring virtio 
> floppy dm_mirror dm_region_hash dm_log dm_mod
> CPU: 2 PID: 3101 Comm: tc Tainted: GE
> 4.16.0-rc4.act_vlan.orig+ #403
> Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
> RIP: 0010:tunnel_key_release+0xd/0x40 [act_tunnel_key]
> RSP: 0018:ba46803b7768 EFLAGS: 00010286
> RAX: c09010a0 RBX:  RCX: 0024
> RDX:  RSI:  RDI: 99ee336d7480
> RBP:  R08: 0001 R09: 0044
> R10: 0220 R11: 99ee79d73131 R12: 
> R13: 99ee32d67610 R14: 99ee7671dc38 R15: fff4
> FS:  7febcb2cd740() GS:99ee7fd0() knlGS:
> CS:  0010 DS:  ES:  CR0: 80050033
> CR2: 0010 CR3: 7c8e4005 CR4: 001606e0
> Call Trace:
>  __tcf_idr_release+0x79/0xf0
>  tunnel_key_init+0xd9/0x460 [act_tunnel_key]
>  tcf_action_init_1+0x2cc/0x430
>  tcf_action_init+0xd3/0x1b0
>  tc_ctl_action+0x18b/0x240
>  rtnetlink_rcv_msg+0x29c/0x310
>  ? _cond_resched+0x15/0x30
>  ? __kmalloc_node_track_caller+0x1b9/0x270
>  ? rtnl_calcit.isra.28+0x100/0x100
>  netlink_rcv_skb+0xd2/0x110
>  netlink_unicast+0x17c/0x230
>  netlink_sendmsg+0x2cd/0x3c0
>  sock_sendmsg+0x30/0x40
>  ___sys_sendmsg+0x27a/0x290
>  __sys_sendmsg+0x51/0x90
>  do_syscall_64+0x6e/0x1a0
>  entry_SYSCALL_64_after_hwframe+0x3d/0xa2
> RIP: 0033:0x7febca6deba0
> RSP: 002b:7ffe7b0dd128 EFLAGS: 0246 ORIG_RAX: 002e
> RAX: ffda RBX: 7ffe7b0dd250 RCX: 7febca6deba0
> RDX:  RSI: 7ffe7b0dd1a0 RDI: 0003
> RBP: 5aaa90cb R08: 0002 R09: 
> R10: 7ffe7b0dcba0 R11: 0246 R12: 
> R13: 7ffe7b0dd264 R14: 0001 R15: 00669f60
> Code: 44 00 00 8b 0d b5 23 00 00 48 8b 87 48 10 00 00 48 8b 3c c8 e9 a5 e5 d8 
> c3 0f 1f 44 00 00 0f 1f 44 00 00 53 48 8b 9f b0 00 00 00 <83> 7b 10 01 74 0b 
> 48 89 df 31 f6 5b e9 f2 fa 7f c3 48 8b 7b 18
> RIP: tunnel_key_release+0xd/0x40 [act_tunnel_key] RSP: ba46803b7768
> CR2: 0010
>
>Fix this in tunnel_key_release(), ensuring 'param' is not NULL before
>dereferencing it.
>
>Fixes: d0f6dd8a914f ("net/sched: Introduce act_tunnel_key")
>Signed-off-by: Davide Caratti 

Acked-by: Jiri Pirko 


[PATCH net 3/5] net/sched: fix NULL dereference in the error path of tunnel_key_init()

2018-03-15 Thread Davide Caratti
when the following command

 # tc action add action tunnel_key unset index 100

is run for the first time, and tunnel_key_init() fails to allocate struct
tcf_tunnel_key_params, tunnel_key_release() dereferences NULL pointers.
This causes the following error:

 BUG: unable to handle kernel NULL pointer dereference at 0010
 IP: tunnel_key_release+0xd/0x40 [act_tunnel_key]
 PGD 800033787067 P4D 800033787067 PUD 74646067 PMD 0
 Oops:  [#1] SMP PTI
 Modules linked in: act_tunnel_key(E) act_csum ip6table_filter ip6_tables 
iptable_filter binfmt_misc ext4 mbcache jbd2 crct10dif_pclmul crc32_pclmul 
snd_hda_codec_generic ghash_clmulni_intel snd_hda_intel pcbc snd_hda_codec 
snd_hda_core snd_hwdep snd_seq aesni_intel snd_seq_device crypto_simd 
glue_helper snd_pcm cryptd joydev snd_timer pcspkr virtio_balloon snd i2c_piix4 
soundcore nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c 
ata_generic pata_acpi qxl drm_kms_helper syscopyarea sysfillrect sysimgblt 
fb_sys_fops ttm virtio_net virtio_blk drm virtio_console crc32c_intel ata_piix 
serio_raw i2c_core virtio_pci libata virtio_ring virtio floppy dm_mirror 
dm_region_hash dm_log dm_mod
 CPU: 2 PID: 3101 Comm: tc Tainted: GE4.16.0-rc4.act_vlan.orig+ 
#403
 Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
 RIP: 0010:tunnel_key_release+0xd/0x40 [act_tunnel_key]
 RSP: 0018:ba46803b7768 EFLAGS: 00010286
 RAX: c09010a0 RBX:  RCX: 0024
 RDX:  RSI:  RDI: 99ee336d7480
 RBP:  R08: 0001 R09: 0044
 R10: 0220 R11: 99ee79d73131 R12: 
 R13: 99ee32d67610 R14: 99ee7671dc38 R15: fff4
 FS:  7febcb2cd740() GS:99ee7fd0() knlGS:
 CS:  0010 DS:  ES:  CR0: 80050033
 CR2: 0010 CR3: 7c8e4005 CR4: 001606e0
 Call Trace:
  __tcf_idr_release+0x79/0xf0
  tunnel_key_init+0xd9/0x460 [act_tunnel_key]
  tcf_action_init_1+0x2cc/0x430
  tcf_action_init+0xd3/0x1b0
  tc_ctl_action+0x18b/0x240
  rtnetlink_rcv_msg+0x29c/0x310
  ? _cond_resched+0x15/0x30
  ? __kmalloc_node_track_caller+0x1b9/0x270
  ? rtnl_calcit.isra.28+0x100/0x100
  netlink_rcv_skb+0xd2/0x110
  netlink_unicast+0x17c/0x230
  netlink_sendmsg+0x2cd/0x3c0
  sock_sendmsg+0x30/0x40
  ___sys_sendmsg+0x27a/0x290
  __sys_sendmsg+0x51/0x90
  do_syscall_64+0x6e/0x1a0
  entry_SYSCALL_64_after_hwframe+0x3d/0xa2
 RIP: 0033:0x7febca6deba0
 RSP: 002b:7ffe7b0dd128 EFLAGS: 0246 ORIG_RAX: 002e
 RAX: ffda RBX: 7ffe7b0dd250 RCX: 7febca6deba0
 RDX:  RSI: 7ffe7b0dd1a0 RDI: 0003
 RBP: 5aaa90cb R08: 0002 R09: 
 R10: 7ffe7b0dcba0 R11: 0246 R12: 
 R13: 7ffe7b0dd264 R14: 0001 R15: 00669f60
 Code: 44 00 00 8b 0d b5 23 00 00 48 8b 87 48 10 00 00 48 8b 3c c8 e9 a5 e5 d8 
c3 0f 1f 44 00 00 0f 1f 44 00 00 53 48 8b 9f b0 00 00 00 <83> 7b 10 01 74 0b 48 
89 df 31 f6 5b e9 f2 fa 7f c3 48 8b 7b 18
 RIP: tunnel_key_release+0xd/0x40 [act_tunnel_key] RSP: ba46803b7768
 CR2: 0010

Fix this in tunnel_key_release(), ensuring 'param' is not NULL before
dereferencing it.

Fixes: d0f6dd8a914f ("net/sched: Introduce act_tunnel_key")
Signed-off-by: Davide Caratti 
---
 net/sched/act_tunnel_key.c | 9 +
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/net/sched/act_tunnel_key.c b/net/sched/act_tunnel_key.c
index 0e23aac09ad6..5dd819840feb 100644
--- a/net/sched/act_tunnel_key.c
+++ b/net/sched/act_tunnel_key.c
@@ -207,11 +207,12 @@ static void tunnel_key_release(struct tc_action *a)
struct tcf_tunnel_key_params *params;
 
params = rcu_dereference_protected(t->params, 1);
+   if (params) {
+   if (params->tcft_action == TCA_TUNNEL_KEY_ACT_SET)
+   dst_release(>tcft_enc_metadata->dst);
 
-   if (params->tcft_action == TCA_TUNNEL_KEY_ACT_SET)
-   dst_release(>tcft_enc_metadata->dst);
-
-   kfree_rcu(params, rcu);
+   kfree_rcu(params, rcu);
+   }
 }
 
 static int tunnel_key_dump_addresses(struct sk_buff *skb,
-- 
2.14.3