308-mac80211-fix-radiotap-header-generation.patch 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. From: Johannes Berg <[email protected]>
  2. Date: Tue, 9 Nov 2021 10:02:04 +0100
  3. Subject: [PATCH] mac80211: fix radiotap header generation
  4. In commit 8c89f7b3d3f2 ("mac80211: Use flex-array for radiotap header
  5. bitmap") we accidentally pointed the position to the wrong place, so
  6. we overwrite a present bitmap, and thus cause all kinds of trouble.
  7. To see the issue, note that the previous code read:
  8. pos = (void *)(it_present + 1);
  9. The requirement now is that we need to calculate pos via it_optional,
  10. to not trigger the compiler hardening checks, as:
  11. pos = (void *)&rthdr->it_optional[...];
  12. Rewriting the original expression, we get (obviously, since that just
  13. adds "+ x - x" terms):
  14. pos = (void *)(it_present + 1 + rthdr->it_optional - rthdr->it_optional)
  15. and moving the "+ rthdr->it_optional" outside to be used as an array:
  16. pos = (void *)&rthdr->it_optional[it_present + 1 - rthdr->it_optional];
  17. The original is off by one, fix it.
  18. Cc: [email protected]
  19. Fixes: 8c89f7b3d3f2 ("mac80211: Use flex-array for radiotap header bitmap")
  20. Reported-by: Sid Hayn <[email protected]>
  21. Signed-off-by: Johannes Berg <[email protected]>
  22. Tested-by: Sid Hayn <[email protected]>
  23. Reviewed-by: Kees Cook <[email protected]>
  24. Link: https://lore.kernel.org/r/20211109100203.c61007433ed6.I1dade57aba7de9c4f48d68249adbae62636fd98c@changeid
  25. Signed-off-by: Johannes Berg <[email protected]>
  26. ---
  27. --- a/net/mac80211/rx.c
  28. +++ b/net/mac80211/rx.c
  29. @@ -364,7 +364,7 @@ ieee80211_add_rx_radiotap_header(struct
  30. * the compiler to think we have walked past the end of the
  31. * struct member.
  32. */
  33. - pos = (void *)&rthdr->it_optional[it_present - rthdr->it_optional];
  34. + pos = (void *)&rthdr->it_optional[it_present + 1 - rthdr->it_optional];
  35. /* the order of the following fields is important */