x86/extable: hide use of negative offset from array start

In COVERAGE=y but DEBUG=n builds (observed by randconfig testing) gcc12
takes issue with the subtraction of 1 from __stop___pre_ex_table[],
considering this an out of bounds access. Not being able to know that
the symbol actually marks the end of an array, the compiler is kind of
right with this diagnosis. Move the subtraction into the function.

Reported-by: Anthony Perard <anthony.perard@citrix.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Jan Beulich committed 2023-02-22 13:50:20 +01:00
1 parent b77ed96fce
commit 353b8cc568
1 file changed
+5 -4
+5 -4
View File
@@ -64,9 +64,10 @@ void __init sort_exception_tables(void)
static unsigned long
search_one_extable(const struct exception_table_entry *first,
const struct exception_table_entry *last,
const struct exception_table_entry *end,
unsigned long value)
{
const struct exception_table_entry *last = end - 1;
const struct exception_table_entry *mid;
long diff;
@@ -91,7 +92,7 @@ search_exception_table(const struct cpu_user_regs *regs)
unsigned long stub = this_cpu(stubs.addr);
if ( region && region->ex )
return search_one_extable(region->ex, region->ex_end - 1, regs->rip);
return search_one_extable(region->ex, region->ex_end, regs->rip);
if ( regs->rip >= stub + STUB_BUF_SIZE / 2 &&
regs->rip < stub + STUB_BUF_SIZE &&
@@ -102,7 +103,7 @@ search_exception_table(const struct cpu_user_regs *regs)
region = find_text_region(retptr);
retptr = region && region->ex
? search_one_extable(region->ex, region->ex_end - 1, retptr)
? search_one_extable(region->ex, region->ex_end, retptr)
: 0;
if ( retptr )
{
@@ -198,7 +199,7 @@ search_pre_exception_table(struct cpu_user_regs *regs)
{
unsigned long addr = regs->rip;
unsigned long fixup = search_one_extable(
__start___pre_ex_table, __stop___pre_ex_table-1, addr);
__start___pre_ex_table, __stop___pre_ex_table, addr);
if ( fixup )
{
dprintk(XENLOG_INFO, "Pre-exception: %p -> %p\n", _p(addr), _p(fixup));
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.