addend = get_addend(type, dest);
}
- if ( symndx > elf->nsym )
+ if ( symndx == STN_UNDEF )
+ {
+ dprintk(XENLOG_ERR, LIVEPATCH "%s: Encountered STN_UNDEF\n",
+ elf->name);
+ return -EOPNOTSUPP;
+ }
+ else if ( symndx >= elf->nsym )
{
dprintk(XENLOG_ERR, LIVEPATCH "%s: Relative symbol wants symbol@%u which is past end!\n",
elf->name, symndx);
return -EINVAL;
}
+ else if ( !elf->sym[symndx].sym )
+ {
+ dprintk(XENLOG_ERR, LIVEPATCH "%s: No relative symbol@%u\n",
+ elf->name, symndx);
+ return -EINVAL;
+ }
val = elf->sym[symndx].sym->st_value; /* S */
int ovf = 0;
uint64_t val;
- if ( symndx > elf->nsym )
+ if ( symndx == STN_UNDEF )
+ {
+ dprintk(XENLOG_ERR, LIVEPATCH "%s: Encountered STN_UNDEF\n",
+ elf->name);
+ return -EOPNOTSUPP;
+ }
+ else if ( symndx >= elf->nsym )
{
dprintk(XENLOG_ERR, LIVEPATCH "%s: Relative relocation wants symbol@%u which is past end!\n",
elf->name, symndx);
return -EINVAL;
}
+ else if ( !elf->sym[symndx].sym )
+ {
+ dprintk(XENLOG_ERR, LIVEPATCH "%s: No relative symbol@%u\n",
+ elf->name, symndx);
+ return -EINVAL;
+ }
val = elf->sym[symndx].sym->st_value + r->r_addend; /* S+A */
uint8_t *dest = base->load_addr + r->r_offset;
uint64_t val;
- if ( symndx > elf->nsym )
+ if ( symndx == STN_UNDEF )
+ {
+ dprintk(XENLOG_ERR, LIVEPATCH "%s: Encountered STN_UNDEF\n",
+ elf->name);
+ return -EOPNOTSUPP;
+ }
+ else if ( symndx >= elf->nsym )
{
dprintk(XENLOG_ERR, LIVEPATCH "%s: Relative relocation wants symbol@%u which is past end!\n",
elf->name, symndx);
return -EINVAL;
}
+ else if ( !elf->sym[symndx].sym )
+ {
+ dprintk(XENLOG_ERR, LIVEPATCH "%s: No symbol@%u\n",
+ elf->name, symndx);
+ return -EINVAL;
+ }
val = r->r_addend + elf->sym[symndx].sym->st_value;