linux/drivers/infiniband/hw/hfi1
Michael J. Ruhl f9e76ca377 IB/hfi1: Use after free race condition in send context error path
A pio send egress error can occur when the PSM library attempts to
to send a bad packet.  That issue is still being investigated.

The pio error interrupt handler then attempts to progress the recovery
of the errored pio send context.

Code inspection reveals that the handling lacks the necessary locking
if that recovery interleaves with a PSM close of the "context" object
contains the pio send context.

The lack of the locking can cause the recovery to access the already
freed pio send context object and incorrectly deduce that the pio
send context is actually a kernel pio send context as shown by the
NULL deref stack below:

[<ffffffff8143d78c>] _dev_info+0x6c/0x90
[<ffffffffc0613230>] sc_restart+0x70/0x1f0 [hfi1]
[<ffffffff816ab124>] ? __schedule+0x424/0x9b0
[<ffffffffc06133c5>] sc_halted+0x15/0x20 [hfi1]
[<ffffffff810aa3ba>] process_one_work+0x17a/0x440
[<ffffffff810ab086>] worker_thread+0x126/0x3c0
[<ffffffff810aaf60>] ? manage_workers.isra.24+0x2a0/0x2a0
[<ffffffff810b252f>] kthread+0xcf/0xe0
[<ffffffff810b2460>] ? insert_kthread_work+0x40/0x40
[<ffffffff816b8798>] ret_from_fork+0x58/0x90
[<ffffffff810b2460>] ? insert_kthread_work+0x40/0x40

This is the best case scenario and other scenarios can corrupt the
already freed memory.

Fix by adding the necessary locking in the pio send context error
handler.

Cc: <stable@vger.kernel.org> # 4.9.x
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
2018-05-09 10:39:50 -04:00
..
Kconfig IB/hfi1: Remove HFI1_VERBS_31BIT_PSN option 2017-08-22 14:22:38 -04:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
affinity.c IB/hfi1: Fix memory leak in exception path in get_irq_affinity() 2018-05-03 15:24:48 -04:00
affinity.h
aspm.h IB/hfi1: Convert timers to use timer_setup() 2017-10-18 11:48:19 -04:00
chip.c IB/hfi1: Use after free race condition in send context error path 2018-05-09 10:39:50 -04:00
chip.h IB/hfi1: Convert PortXmitWait/PortVLXmitWait counters to flit times 2018-02-01 15:43:30 -07:00
chip_registers.h
common.h IB/hfi1: Eliminate allocation while atomic 2017-10-18 10:12:59 -04:00
debugfs.c IB/hfi1: Show fault stats in both TX and RX directions 2018-02-01 15:43:31 -07:00
debugfs.h
device.c
device.h
driver.c IB/hfi1: Fix handling of FECN marked multicast packet 2018-05-03 15:24:44 -04:00
efivar.c
efivar.h
eprom.c IB/hfi1: Check eeprom config partition validity 2017-09-27 11:10:36 -04:00
eprom.h
exp_rcv.c
exp_rcv.h IB/hfi1: Fix bar0 mapping to use write combining 2017-07-31 15:17:54 -04:00
file_ops.c treewide: remove large struct-pass-by-value from tracepoint arguments 2018-03-28 22:55:18 +02:00
firmware.c IB/hfi1: Fix infinite loop in 8051 command error path 2018-01-05 13:34:55 -05:00
hfi.h IB/hfi1: Fix handling of FECN marked multicast packet 2018-05-03 15:24:44 -04:00
init.c IB/{hfi1, rdmavt}: Fix memory leak in hfi1_alloc_devdata() upon failure 2018-05-03 15:24:48 -04:00
intr.c IB/hfi1: Allow MgmtAllowed on B2B setups 2017-11-13 15:53:56 -05:00
iowait.h IB/hfi1: Remove dependence on qp->s_hdrwords 2018-02-01 15:24:32 -07:00
mad.c IB/hfi1: Convert PortXmitWait/PortVLXmitWait counters to flit times 2018-02-01 15:43:30 -07:00
mad.h IB/hfi1: Convert PortXmitWait/PortVLXmitWait counters to flit times 2018-02-01 15:43:30 -07:00
mmu_rb.c mm, mmu_notifier: annotate mmu notifiers with blockable invalidate callbacks 2018-01-31 17:18:38 -08:00
mmu_rb.h
opa_compat.h IB/hfi1: Document phys port state bits not used in IB 2017-08-22 14:22:37 -04:00
pcie.c IB/hfi1: Fix NULL pointer dereference when invalid num_vls is used 2018-05-03 15:24:47 -04:00
pio.c IB/hfi1: Convert kzalloc_node and kcalloc to use kcalloc_node 2018-02-01 15:43:32 -07:00
pio.h IB/hfi1: Do not allocate PIO send contexts for VNIC 2017-11-13 15:53:57 -05:00
pio_copy.c
platform.c IB/{hfi1, rdmavt}: Fix memory leak in hfi1_alloc_devdata() upon failure 2018-05-03 15:24:48 -04:00
platform.h
qp.c IB/hfi1: Fix a kernel-doc warning 2018-03-13 16:21:14 -04:00
qp.h IB/hfi1: Remove dependence on qp->s_hdrwords 2018-02-01 15:24:32 -07:00
qsfp.c IB/{hfi1, rdmavt}: Fix memory leak in hfi1_alloc_devdata() upon failure 2018-05-03 15:24:48 -04:00
qsfp.h
rc.c Second pull request for 4.16 merge window 2018-02-06 11:09:45 -08:00
ruc.c IB/hfi1: Fix loss of BECN with AHG 2018-05-03 15:24:47 -04:00
sdma.c Second pull request for 4.16 merge window 2018-02-06 11:09:45 -08:00
sdma.h IB/hfi1: Fix for early release of sdma context 2018-02-01 15:24:32 -07:00
sdma_txreq.h
sysfs.c IB/hfi1: Fix incorrect available receive user context count 2017-10-04 15:39:44 -04:00
trace.c IB/hfi1: Remove unnecessary fecn and becn fields 2018-02-01 15:43:29 -07:00
trace.h IB/hfi1: Extend input hdr tracing for packet type 2017-09-27 11:34:13 -04:00
trace_ctxts.h treewide: remove large struct-pass-by-value from tracepoint arguments 2018-03-28 22:55:18 +02:00
trace_dbg.h
trace_ibhdrs.h IB/hfi1: Remove unnecessary fecn and becn fields 2018-02-01 15:43:29 -07:00
trace_misc.h
trace_mmu.h IB/hif1: Remove static tracing from SDMA hot path 2017-08-28 19:12:27 -04:00
trace_rc.h
trace_rx.h IB/hfi1: Add 16B rcvhdr trace support 2018-02-01 15:43:32 -07:00
trace_tx.h IB/hif1: Remove static tracing from SDMA hot path 2017-08-28 19:12:27 -04:00
uc.c Second pull request for 4.16 merge window 2018-02-06 11:09:45 -08:00
ud.c IB/hfi1: Fix handling of FECN marked multicast packet 2018-05-03 15:24:44 -04:00
user_exp_rcv.c RDMA: Use u64_to_user_ptr everywhere 2018-03-29 13:42:29 -06:00
user_exp_rcv.h IB/hfi1: Move structure definitions from user_exp_rcv.c to user_exp_rcv.h 2017-08-28 19:12:22 -04:00
user_pages.c
user_sdma.c Updates for 4.15 kernel merge window 2017-11-15 14:54:53 -08:00
user_sdma.h IB/hfi1: Convert the macro AHG_HEADER_SET into an inline function 2017-09-27 11:34:13 -04:00
verbs.c IB/uverbs: Extend uverbs_ioctl header with driver_id 2018-03-19 14:45:17 -06:00
verbs.h IB/hfi1: Remove blind constants from 16B update 2018-02-01 15:43:30 -07:00
verbs_txreq.c IB/hfi1: Improve local kmem_cache_alloc performance 2017-08-28 19:12:18 -04:00
verbs_txreq.h IB/hfi1: Remove dependence on qp->s_hdrwords 2018-02-01 15:24:32 -07:00
vnic.h IB/hfi1: Add support to receive 16B bypass packets 2017-08-22 14:22:37 -04:00
vnic_main.c IB/hfi1: Do not allocate PIO send contexts for VNIC 2017-11-13 15:53:57 -05:00
vnic_sdma.c IB/hfi1: Improve local kmem_cache_alloc performance 2017-08-28 19:12:18 -04:00