|
@@ -680,7 +680,14 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
|
|
|
|
|
|
case R_PPC64_REL32:
|
|
case R_PPC64_REL32:
|
|
/* 32 bits relative (used by relative exception tables) */
|
|
/* 32 bits relative (used by relative exception tables) */
|
|
- *(u32 *)location = value - (unsigned long)location;
|
|
|
|
|
|
+ /* Convert value to relative */
|
|
|
|
+ value -= (unsigned long)location;
|
|
|
|
+ if (value + 0x80000000 > 0xffffffff) {
|
|
|
|
+ pr_err("%s: REL32 %li out of range!\n",
|
|
|
|
+ me->name, (long int)value);
|
|
|
|
+ return -ENOEXEC;
|
|
|
|
+ }
|
|
|
|
+ *(u32 *)location = value;
|
|
break;
|
|
break;
|
|
|
|
|
|
case R_PPC64_TOCSAVE:
|
|
case R_PPC64_TOCSAVE:
|