0011-IB-core-Avoid-crash-on-pkey-enforcement-failed-in-re.patch 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. From 406a5590ca8c58f0f92927230285a3388e4527e4 Mon Sep 17 00:00:00 2001
  2. From: Parav Pandit <[email protected]>
  3. Date: Fri, 5 Jan 2018 23:51:12 +0100
  4. Subject: [PATCH 011/231] IB/core: Avoid crash on pkey enforcement failed in
  5. received MADs
  6. MIME-Version: 1.0
  7. Content-Type: text/plain; charset=UTF-8
  8. Content-Transfer-Encoding: 8bit
  9. commit 89548bcafec7ecfeea58c553f0834b5d575a66eb upstream.
  10. Below kernel crash is observed when Pkey security enforcement fails on
  11. received MADs. This issue is reported in [1].
  12. ib_free_recv_mad() accesses the rmpp_list, whose initialization is
  13. needed before accessing it.
  14. When security enformcent fails on received MADs, MAD processing avoided
  15. due to security checks failed.
  16. OpenSM[3770]: SM port is down
  17. kernel: BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
  18. kernel: IP: ib_free_recv_mad+0x44/0xa0 [ib_core]
  19. kernel: PGD 0
  20. kernel: P4D 0
  21. kernel:
  22. kernel: Oops: 0002 [#1] SMP
  23. kernel: CPU: 0 PID: 2833 Comm: kworker/0:1H Tainted: P IO 4.13.4-1-pve #1
  24. kernel: Hardware name: Dell XS23-TY3 /9CMP63, BIOS 1.71 09/17/2013
  25. kernel: Workqueue: ib-comp-wq ib_cq_poll_work [ib_core]
  26. kernel: task: ffffa069c6541600 task.stack: ffffb9a729054000
  27. kernel: RIP: 0010:ib_free_recv_mad+0x44/0xa0 [ib_core]
  28. kernel: RSP: 0018:ffffb9a729057d38 EFLAGS: 00010286
  29. kernel: RAX: ffffa069cb138a48 RBX: ffffa069cb138a10 RCX: 0000000000000000
  30. kernel: RDX: ffffb9a729057d38 RSI: 0000000000000000 RDI: ffffa069cb138a20
  31. kernel: RBP: ffffb9a729057d60 R08: ffffa072d2d49800 R09: ffffa069cb138ae0
  32. kernel: R10: ffffa069cb138ae0 R11: ffffa072b3994e00 R12: ffffb9a729057d38
  33. kernel: R13: ffffa069d1c90000 R14: 0000000000000000 R15: ffffa069d1c90880
  34. kernel: FS: 0000000000000000(0000) GS:ffffa069dba00000(0000) knlGS:0000000000000000
  35. kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
  36. kernel: CR2: 0000000000000008 CR3: 00000011f51f2000 CR4: 00000000000006f0
  37. kernel: Call Trace:
  38. kernel: ib_mad_recv_done+0x5cc/0xb50 [ib_core]
  39. kernel: __ib_process_cq+0x5c/0xb0 [ib_core]
  40. kernel: ib_cq_poll_work+0x20/0x60 [ib_core]
  41. kernel: process_one_work+0x1e9/0x410
  42. kernel: worker_thread+0x4b/0x410
  43. kernel: kthread+0x109/0x140
  44. kernel: ? process_one_work+0x410/0x410
  45. kernel: ? kthread_create_on_node+0x70/0x70
  46. kernel: ? SyS_exit_group+0x14/0x20
  47. kernel: ret_from_fork+0x25/0x30
  48. kernel: RIP: ib_free_recv_mad+0x44/0xa0 [ib_core] RSP: ffffb9a729057d38
  49. kernel: CR2: 0000000000000008
  50. [1] : https://www.spinics.net/lists/linux-rdma/msg56190.html
  51. Fixes: 47a2b338fe63 ("IB/core: Enforce security on management datagrams")
  52. Signed-off-by: Parav Pandit <[email protected]>
  53. Reported-by: Chris Blake <[email protected]>
  54. Reviewed-by: Daniel Jurgens <[email protected]>
  55. Reviewed-by: Hal Rosenstock <[email protected]>
  56. Signed-off-by: Doug Ledford <[email protected]>
  57. Signed-off-by: Greg Kroah-Hartman <[email protected]>
  58. Signed-off-by: Fabian Grünbichler <[email protected]>
  59. ---
  60. drivers/infiniband/core/mad.c | 3 ++-
  61. 1 file changed, 2 insertions(+), 1 deletion(-)
  62. diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
  63. index f8f53bb90837..cb91245e9163 100644
  64. --- a/drivers/infiniband/core/mad.c
  65. +++ b/drivers/infiniband/core/mad.c
  66. @@ -1974,14 +1974,15 @@ static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv,
  67. unsigned long flags;
  68. int ret;
  69. + INIT_LIST_HEAD(&mad_recv_wc->rmpp_list);
  70. ret = ib_mad_enforce_security(mad_agent_priv,
  71. mad_recv_wc->wc->pkey_index);
  72. if (ret) {
  73. ib_free_recv_mad(mad_recv_wc);
  74. deref_mad_agent(mad_agent_priv);
  75. + return;
  76. }
  77. - INIT_LIST_HEAD(&mad_recv_wc->rmpp_list);
  78. list_add(&mad_recv_wc->recv_buf.list, &mad_recv_wc->rmpp_list);
  79. if (ib_mad_kernel_rmpp_agent(&mad_agent_priv->agent)) {
  80. mad_recv_wc = ib_process_rmpp_recv_wc(mad_agent_priv,
  81. --
  82. 2.14.2