sections: global data can be in .bss
authorAntoine Tenart <atenart@kernel.org>
Mon, 22 Nov 2021 14:24:56 +0000 (15:24 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 22 Nov 2021 14:53:45 +0000 (14:53 +0000)
When checking an address is located in a global data section also check
for the .bss section as global variables initialized to 0 can be in
there (-fzero-initialized-in-bss).

This was found when looking at ensure_safe_net_sysctl which was failing
to detect non-init sysctl pointing to a global data section when the
data was in the .bss section.

Signed-off-by: Antoine Tenart <atenart@kernel.org>
Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/asm-generic/sections.h

index 1dfadb2..76a0f16 100644 (file)
@@ -130,18 +130,24 @@ static inline bool init_section_intersects(void *virt, size_t size)
 
 /**
  * is_kernel_core_data - checks if the pointer address is located in the
- *                      .data section
+ *                      .data or .bss section
  *
  * @addr: address to check
  *
- * Returns: true if the address is located in .data, false otherwise.
+ * Returns: true if the address is located in .data or .bss, false otherwise.
  * Note: On some archs it may return true for core RODATA, and false
  *       for others. But will always be true for core RW data.
  */
 static inline bool is_kernel_core_data(unsigned long addr)
 {
-       return addr >= (unsigned long)_sdata &&
-              addr < (unsigned long)_edata;
+       if (addr >= (unsigned long)_sdata && addr < (unsigned long)_edata)
+               return true;
+
+       if (addr >= (unsigned long)__bss_start &&
+           addr < (unsigned long)__bss_stop)
+               return true;
+
+       return false;
 }
 
 /**