瀏覽代碼

modpost: fix inverted logic in is_extable_fault_address().

As Guenter pointed out, we want to assert that extable_entry_size has been
discovered and not the other way around.  Moreover, this sanity check is
only valid when we're not dealing with the first relocation in __ex_table,
since we have not discovered the extable entry size at that point.

This was leading to a divide-by-zero on some architectures and make the
build fail.

Signed-off-by: Quentin Casasnovas <quentin.casasnovas@oracle.com>
Reported-by: Guenter Roeck <linux@roeck-us.net>
CC: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Quentin Casasnovas 10 年之前
父節點
當前提交
d3df4de7eb
共有 1 個文件被更改,包括 6 次插入1 次删除
  1. 6 1
      scripts/mod/modpost.c

+ 6 - 1
scripts/mod/modpost.c

@@ -1529,7 +1529,12 @@ static void find_extable_entry_size(const char* const sec, const Elf_Rela* r,
 }
 }
 static inline bool is_extable_fault_address(Elf_Rela *r)
 static inline bool is_extable_fault_address(Elf_Rela *r)
 {
 {
-	if (!extable_entry_size == 0)
+	/*
+	 * extable_entry_size is only discovered after we've handled the
+	 * _second_ relocation in __ex_table, so only abort when we're not
+	 * handling the first reloc and extable_entry_size is zero.
+	 */
+	if (r->r_offset && extable_entry_size == 0)
 		fatal("extable_entry size hasn't been discovered!\n");
 		fatal("extable_entry size hasn't been discovered!\n");
 
 
 	return ((r->r_offset == 0) ||
 	return ((r->r_offset == 0) ||