350-mac80211-fix-memory-leaks-with-element-parsing.patch 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. From: Johannes Berg <[email protected]>
  2. Date: Fri, 1 Oct 2021 21:11:08 +0200
  3. Subject: [PATCH] mac80211: fix memory leaks with element parsing
  4. commit 8223ac199a3849257e86ec27865dc63f034b1cf1 upstream.
  5. My previous commit 5d24828d05f3 ("mac80211: always allocate
  6. struct ieee802_11_elems") had a few bugs and leaked the new
  7. allocated struct in a few error cases, fix that.
  8. Fixes: 5d24828d05f3 ("mac80211: always allocate struct ieee802_11_elems")
  9. Signed-off-by: Johannes Berg <[email protected]>
  10. Link: https://lore.kernel.org/r/20211001211108.9839928e42e0.Ib81ca187d3d3af7ed1bfeac2e00d08a4637c8025@changeid
  11. Signed-off-by: Johannes Berg <[email protected]>
  12. ---
  13. --- a/net/mac80211/agg-rx.c
  14. +++ b/net/mac80211/agg-rx.c
  15. @@ -499,13 +499,14 @@ void ieee80211_process_addba_request(str
  16. elems = ieee802_11_parse_elems(mgmt->u.action.u.addba_req.variable,
  17. ies_len, true, mgmt->bssid, NULL);
  18. if (!elems || elems->parse_error)
  19. - return;
  20. + goto free;
  21. }
  22. __ieee80211_start_rx_ba_session(sta, dialog_token, timeout,
  23. start_seq_num, ba_policy, tid,
  24. buf_size, true, false,
  25. elems ? elems->addba_ext_ie : NULL);
  26. +free:
  27. kfree(elems);
  28. }
  29. --- a/net/mac80211/ibss.c
  30. +++ b/net/mac80211/ibss.c
  31. @@ -1659,11 +1659,11 @@ void ieee80211_ibss_rx_queued_mgmt(struc
  32. mgmt->u.action.u.chan_switch.variable,
  33. ies_len, true, mgmt->bssid, NULL);
  34. - if (!elems || elems->parse_error)
  35. - break;
  36. -
  37. - ieee80211_rx_mgmt_spectrum_mgmt(sdata, mgmt, skb->len,
  38. - rx_status, elems);
  39. + if (elems && !elems->parse_error)
  40. + ieee80211_rx_mgmt_spectrum_mgmt(sdata, mgmt,
  41. + skb->len,
  42. + rx_status,
  43. + elems);
  44. kfree(elems);
  45. break;
  46. }
  47. --- a/net/mac80211/mlme.c
  48. +++ b/net/mac80211/mlme.c
  49. @@ -3374,8 +3374,10 @@ static bool ieee80211_assoc_success(stru
  50. bss_ies = kmemdup(ies, sizeof(*ies) + ies->len,
  51. GFP_ATOMIC);
  52. rcu_read_unlock();
  53. - if (!bss_ies)
  54. - return false;
  55. + if (!bss_ies) {
  56. + ret = false;
  57. + goto out;
  58. + }
  59. bss_elems = ieee802_11_parse_elems(bss_ies->data, bss_ies->len,
  60. false, mgmt->bssid,
  61. @@ -4358,13 +4360,11 @@ void ieee80211_sta_rx_queued_mgmt(struct
  62. mgmt->u.action.u.chan_switch.variable,
  63. ies_len, true, mgmt->bssid, NULL);
  64. - if (!elems || elems->parse_error)
  65. - break;
  66. -
  67. - ieee80211_sta_process_chanswitch(sdata,
  68. - rx_status->mactime,
  69. - rx_status->device_timestamp,
  70. - elems, false);
  71. + if (elems && !elems->parse_error)
  72. + ieee80211_sta_process_chanswitch(sdata,
  73. + rx_status->mactime,
  74. + rx_status->device_timestamp,
  75. + elems, false);
  76. kfree(elems);
  77. } else if (mgmt->u.action.category == WLAN_CATEGORY_PUBLIC) {
  78. struct ieee802_11_elems *elems;
  79. @@ -4384,17 +4384,17 @@ void ieee80211_sta_rx_queued_mgmt(struct
  80. mgmt->u.action.u.ext_chan_switch.variable,
  81. ies_len, true, mgmt->bssid, NULL);
  82. - if (!elems || elems->parse_error)
  83. - break;
  84. + if (elems && !elems->parse_error) {
  85. + /* for the handling code pretend it was an IE */
  86. + elems->ext_chansw_ie =
  87. + &mgmt->u.action.u.ext_chan_switch.data;
  88. +
  89. + ieee80211_sta_process_chanswitch(sdata,
  90. + rx_status->mactime,
  91. + rx_status->device_timestamp,
  92. + elems, false);
  93. + }
  94. - /* for the handling code pretend this was also an IE */
  95. - elems->ext_chansw_ie =
  96. - &mgmt->u.action.u.ext_chan_switch.data;
  97. -
  98. - ieee80211_sta_process_chanswitch(sdata,
  99. - rx_status->mactime,
  100. - rx_status->device_timestamp,
  101. - elems, false);
  102. kfree(elems);
  103. }
  104. break;