• Davide Caratti's avatar
    net/sched: act_csum: fix NULL dereference when 'goto chain' is used · 11a245e2
    Davide Caratti authored
    the control action in the common member of struct tcf_csum must be a valid
    value, as it can contain the chain index when 'goto chain' is used. Ensure
    that the control action can be read as x->tcfa_action, when x is a pointer
    to struct tc_action and x->ops->type is TCA_ACT_CSUM, to prevent the
    following command:
    
      # tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
      > $tcflags dst_mac $h2mac action csum ip or tcp or udp or sctp goto chain 1
    
    from triggering a NULL pointer dereference when a matching packet is
    received.
    
     BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
     PGD 800000010416b067 P4D 800000010416b067 PUD 1041be067 PMD 0
     Oops: 0000 [#1] SMP PTI
     CPU: 0 PID: 3072 Comm: mausezahn Tainted: G            E     4.18.0-rc2.auguri+ #421
     Hardware name: Hewlett-Packard HP Z220 CMT Workstation/1790, BIOS K51 v01.58 02/07/2013
     RIP: 0010:tcf_action_exec+0xb8/0x100
     Code: 00 00 00 20 74 1d 83 f8 03 75 09 49 83 c4 08 4d 39 ec 75 bc 48 83 c4 10 5b 5d 41 5c 41 5d 41 5e 41 5f c3 49 8b 97 a8 00 00 00 <48> 8b 12 48 89 55 00 48 83 c4 10 5b 5d 41 5c 41 5d 41 5e 41 5f c3
     RSP: 0018:ffffa020dea03c40 EFLAGS: 00010246
     RAX: 0000000020000001 RBX: ffffa020d7ccef00 RCX: 0000000000000054
     RDX: 0000000000000000 RSI: ffffa020ca5ae000 RDI: ffffa020d7ccef00
     RBP: ffffa020dea03e60 R08: 0000000000000000 R09: ffffa020dea03c9c
     R10: ffffa020dea03c78 R11: 0000000000000008 R12: ffffa020d3fe4f00
     R13: ffffa020d3fe4f08 R14: 0000000000000001 R15: ffffa020d53ca300
     FS:  00007f5a46942740(0000) GS:ffffa020dea00000(0000) knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 0000000000000000 CR3: 0000000104218002 CR4: 00000000001606f0
     Call Trace:
      <IRQ>
      fl_classify+0x1ad/0x1c0 [cls_flower]
      ? arp_rcv+0x121/0x1b0
      ? __x2apic_send_IPI_dest+0x40/0x40
      ? smp_reschedule_interrupt+0x1c/0xd0
      ? reschedule_interrupt+0xf/0x20
      ? reschedule_interrupt+0xa/0x20
      ? device_is_rmrr_locked+0xe/0x50
      ? iommu_should_identity_map+0x49/0xd0
      ? __intel_map_single+0x30/0x140
      ? e1000e_update_rdt_wa.isra.52+0x22/0xb0 [e1000e]
      ? e1000_alloc_rx_buffers+0x233/0x250 [e1000e]
      ? kmem_cache_alloc+0x38/0x1c0
      tcf_classify+0x89/0x140
      __netif_receive_skb_core+0x5ea/0xb70
      ? enqueue_task_fair+0xb6/0x7d0
      ? process_backlog+0x97/0x150
      process_backlog+0x97/0x150
      net_rx_action+0x14b/0x3e0
      __do_softirq+0xde/0x2b4
      do_softirq_own_stack+0x2a/0x40
      </IRQ>
      do_softirq.part.18+0x49/0x50
      __local_bh_enable_ip+0x49/0x50
      __dev_queue_xmit+0x4ab/0x8a0
      ? wait_woken+0x80/0x80
      ? packet_sendmsg+0x38f/0x810
      ? __dev_queue_xmit+0x8a0/0x8a0
      packet_sendmsg+0x38f/0x810
      sock_sendmsg+0x36/0x40
      __sys_sendto+0x10e/0x140
      ? do_vfs_ioctl+0xa4/0x630
      ? syscall_trace_enter+0x1df/0x2e0
      ? __audit_syscall_exit+0x22a/0x290
      __x64_sys_sendto+0x24/0x30
      do_syscall_64+0x5b/0x180
      entry_SYSCALL_64_after_hwframe+0x44/0xa9
     RIP: 0033:0x7f5a45cbec93
     Code: 48 8b 0d 18 83 20 00 f7 d8 64 89 01 48 83 c8 ff c3 66 0f 1f 44 00 00 83 3d 59 c7 20 00 00 75 13 49 89 ca b8 2c 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 34 c3 48 83 ec 08 e8 2b f7 ff ff 48 89 04 24
     RSP: 002b:00007ffd0ee6d748 EFLAGS: 00000246 ORIG_RAX: 000000000000002c
     RAX: ffffffffffffffda RBX: 0000000001161010 RCX: 00007f5a45cbec93
     RDX: 0000000000000062 RSI: 0000000001161322 RDI: 0000000000000003
     RBP: 00007ffd0ee6d780 R08: 00007ffd0ee6d760 R09: 0000000000000014
     R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000062
     R13: 0000000001161322 R14: 00007ffd0ee6d760 R15: 0000000000000003
     Modules linked in: act_csum act_gact cls_flower sch_ingress vrf veth act_tunnel_key(E) xt_CHECKSUM iptable_mangle ipt_MASQUERADE iptable_nat nf_nat_ipv4 nf_nat nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack ipt_REJECT nf_reject_ipv4 tun bridge stp llc ebtable_filter ebtables ip6table_filter ip6_tables iptable_filter intel_rapl x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel snd_hda_codec_hdmi snd_hda_codec_realtek kvm snd_hda_codec_generic hp_wmi iTCO_wdt sparse_keymap rfkill mei_wdt iTCO_vendor_support wmi_bmof gpio_ich irqbypass crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcbc aesni_intel snd_hda_intel crypto_simd cryptd snd_hda_codec glue_helper snd_hda_core snd_hwdep snd_seq snd_seq_device snd_pcm pcspkr i2c_i801 snd_timer snd sg lpc_ich soundcore wmi mei_me
      mei ie31200_edac nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c sr_mod cdrom sd_mod ahci libahci crc32c_intel i915 ixgbe serio_raw libata video dca i2c_algo_bit sfc drm_kms_helper syscopyarea mtd sysfillrect mdio sysimgblt fb_sys_fops drm e1000e i2c_core
     CR2: 0000000000000000
     ---[ end trace 3c9e9d1a77df4026 ]---
     RIP: 0010:tcf_action_exec+0xb8/0x100
     Code: 00 00 00 20 74 1d 83 f8 03 75 09 49 83 c4 08 4d 39 ec 75 bc 48 83 c4 10 5b 5d 41 5c 41 5d 41 5e 41 5f c3 49 8b 97 a8 00 00 00 <48> 8b 12 48 89 55 00 48 83 c4 10 5b 5d 41 5c 41 5d 41 5e 41 5f c3
     RSP: 0018:ffffa020dea03c40 EFLAGS: 00010246
     RAX: 0000000020000001 RBX: ffffa020d7ccef00 RCX: 0000000000000054
     RDX: 0000000000000000 RSI: ffffa020ca5ae000 RDI: ffffa020d7ccef00
     RBP: ffffa020dea03e60 R08: 0000000000000000 R09: ffffa020dea03c9c
     R10: ffffa020dea03c78 R11: 0000000000000008 R12: ffffa020d3fe4f00
     R13: ffffa020d3fe4f08 R14: 0000000000000001 R15: ffffa020d53ca300
     FS:  00007f5a46942740(0000) GS:ffffa020dea00000(0000) knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 0000000000000000 CR3: 0000000104218002 CR4: 00000000001606f0
     Kernel panic - not syncing: Fatal exception in interrupt
     Kernel Offset: 0x26400000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
     ---[ end Kernel panic - not syncing: Fatal exception in interrupt ]---
    
    Fixes: 9c5f69bb ("net/sched: act_csum: don't use spinlock in the fast path")
    Signed-off-by: default avatarDavide Caratti <dcaratti@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    11a245e2
act_csum.c 15.8 KB