|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/2] xen/livepatch: Clean up arch relocation handling
On 14/06/17 15:02, Jan Beulich wrote:
>>>> On 14.06.17 at 15:44, <konrad.wilk@xxxxxxxxxx> wrote:
>> On Tue, Jun 13, 2017 at 09:51:35PM +0100, Andrew Cooper wrote:
>>> --- a/xen/arch/arm/arm32/livepatch.c
>>> +++ b/xen/arch/arm/arm32/livepatch.c
>>> @@ -224,21 +224,21 @@ int arch_livepatch_perform(struct livepatch_elf *elf,
>>> const struct livepatch_elf_sec *rela,
>>> bool use_rela)
>>> {
>>> - const Elf_RelA *r_a;
>>> - const Elf_Rel *r;
>>> - unsigned int symndx, i;
>>> - uint32_t val;
>>> - void *dest;
>>> + unsigned int i;
>>> int rc = 0;
>>>
>>> for ( i = 0; i < (rela->sec->sh_size / rela->sec->sh_entsize); i++ )
>>> {
>>> + unsigned int symndx;
>>> + uint32_t val;
>>> + void *dest;
>>> unsigned char type;
>>> - s32 addend = 0;
>>> + s32 addend;
>>>
>>> if ( use_rela )
>>> {
>>> - r_a = rela->data + i * rela->sec->sh_entsize;
>>> + const Elf_RelA *r_a = rela->data + i * rela->sec->sh_entsize;
>>> +
>>> symndx = ELF32_R_SYM(r_a->r_info);
>>> type = ELF32_R_TYPE(r_a->r_info);
>>> dest = base->load_addr + r_a->r_offset; /* P */
>>> @@ -246,10 +246,12 @@ int arch_livepatch_perform(struct livepatch_elf *elf,
>>> }
>>> else
>>> {
>>> - r = rela->data + i * rela->sec->sh_entsize;
>>> + const Elf_Rel *r = rela->data + i * rela->sec->sh_entsize;
>>> +
>>> symndx = ELF32_R_SYM(r->r_info);
>>> type = ELF32_R_TYPE(r->r_info);
>>> dest = base->load_addr + r->r_offset; /* P */
>>> + addend = get_addend(type, dest);
>>> }
>>>
>>> if ( symndx > elf->nsym )
>>> @@ -259,13 +261,11 @@ int arch_livepatch_perform(struct livepatch_elf *elf,
>>> return -EINVAL;
>>> }
>>>
>>> - if ( !use_rela )
>>> - addend = get_addend(type, dest);
>> This was added right after the symndx > elf->nsym check as
>> way to make sure we won't dereference the dest (b/c the symbol
>> may be outside the bounds).
> But symndx isn't being used here.
Indeed. r->r_offset (and therefore dest) has no direct bearing on symndx.
Having said that, there is no sanity check that r->r_offset is within
base->load_addr + sec->sh_size in arm32, whereas both arm64 and x86
appear to do this check.
~Andrew
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |