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

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