Track whether symbols belong to ignored sections in order to avoid
applying relocations referencing those symbols. The address of such
symbols won't be resolved and thus the relocation will likely fail or
write garbage to the destination.
Return an error in that case, as leaving unresolved relocations would
lead to malfunctioning payload code.
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Tested-by: Bjoern Doebel <doebel@amazon.de>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Ross Lagerwall <ross.lagerwall@citrix.com>
master commit:
9120b5737f517fe9d2a3936c38d3a2211630323b
master date: 2022-04-08 10:27:11 +0200
elf->name, symndx);
return -EINVAL;
}
+ else if ( elf->sym[symndx].ignored )
+ {
+ printk(XENLOG_ERR LIVEPATCH
+ "%s: Relocation against ignored symbol %s cannot be resolved\n",
+ elf->name, elf->sym[symndx].name);
+ return -EINVAL;
+ }
val = elf->sym[symndx].sym->st_value; /* S */
elf->name, symndx);
return -EINVAL;
}
+ else if ( elf->sym[symndx].ignored )
+ {
+ printk(XENLOG_ERR LIVEPATCH
+ "%s: Relocation against ignored symbol %s cannot be resolved\n",
+ elf->name, elf->sym[symndx].name);
+ return -EINVAL;
+ }
val = elf->sym[symndx].sym->st_value + r->r_addend; /* S+A */
elf->name, symndx);
return -EINVAL;
}
+ else if ( elf->sym[symndx].ignored )
+ {
+ printk(XENLOG_ERR LIVEPATCH
+ "%s: Relocation against ignored symbol %s cannot be resolved\n",
+ elf->name, elf->sym[symndx].name);
+ return -EINVAL;
+ }
val = r->r_addend + elf->sym[symndx].sym->st_value;
}
if ( livepatch_elf_ignore_section(elf->sec[idx].sec) )
+ {
+ dprintk(XENLOG_DEBUG, LIVEPATCH
+ "%s: Symbol %s from section %s ignored\n",
+ elf->name, elf->sym[i].name, elf->sec[idx].name);
+ elf->sym[i].ignored = true;
break;
+ }
st_value += (unsigned long)elf->sec[idx].load_addr;
if ( elf->sym[i].name )
struct livepatch_elf_sym {
const Elf_Sym *sym;
const char *name;
+ bool ignored;
};
struct livepatch_elf {