Skip to content

Commit 78006f9

Browse files
anchaoxiaoxiang781216
authored andcommitted
elf/coredump: add sanity checks for stack pointer
stack pointer may be invalid value if in SMP mode, add sanity checks to avoid invalid access Signed-off-by: chao an <[email protected]>
1 parent 50d1de9 commit 78006f9

File tree

1 file changed

+44
-9
lines changed

1 file changed

+44
-9
lines changed

binfmt/libelf/libelf_coredump.c

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -335,16 +335,32 @@ static void elf_emit_note(FAR struct elf_dumpinfo_s *cinfo)
335335
static void elf_emit_tcb_stack(FAR struct elf_dumpinfo_s *cinfo,
336336
FAR struct tcb_s *tcb)
337337
{
338-
FAR void *buf;
338+
FAR void *buf = NULL;
339+
uintptr_t sp;
339340
size_t len;
340341

341342
if (running_task() != tcb)
342343
{
343-
len = ((uintptr_t)tcb->stack_base_ptr + tcb->adj_stack_size) -
344-
up_getusrsp(tcb->xcp.regs);
345-
buf = (FAR void *)up_getusrsp(tcb->xcp.regs);
344+
sp = up_getusrsp(tcb->xcp.regs);
345+
346+
if (sp > (uintptr_t)tcb->stack_base_ptr &&
347+
sp < (uintptr_t)tcb->stack_base_ptr + tcb->adj_stack_size)
348+
{
349+
len = ((uintptr_t)tcb->stack_base_ptr +
350+
tcb->adj_stack_size) - sp;
351+
buf = (FAR void *)sp;
352+
}
353+
#ifdef CONFIG_STACK_COLORATION
354+
else
355+
{
356+
len = up_check_tcbstack(tcb);
357+
buf = (FAR void *)((uintptr_t)tcb->stack_base_ptr +
358+
(tcb->adj_stack_size - len));
359+
}
360+
#endif
346361
}
347-
else
362+
363+
if (buf == NULL)
348364
{
349365
buf = (FAR void *)tcb->stack_alloc_ptr;
350366
len = tcb->adj_stack_size +
@@ -422,13 +438,32 @@ static void elf_emit_tcb_phdr(FAR struct elf_dumpinfo_s *cinfo,
422438
FAR struct tcb_s *tcb,
423439
FAR Elf_Phdr *phdr, off_t *offset)
424440
{
441+
uintptr_t sp;
442+
443+
phdr->p_vaddr = 0;
444+
425445
if (running_task() != tcb)
426446
{
427-
phdr->p_filesz = (uintptr_t)(tcb->stack_base_ptr +
428-
tcb->adj_stack_size) - up_getusrsp(tcb->xcp.regs);
429-
phdr->p_vaddr = up_getusrsp(tcb->xcp.regs);
447+
sp = up_getusrsp(tcb->xcp.regs);
448+
449+
if (sp > (uintptr_t)tcb->stack_base_ptr &&
450+
sp < (uintptr_t)tcb->stack_base_ptr + tcb->adj_stack_size)
451+
{
452+
phdr->p_filesz = ((uintptr_t)tcb->stack_base_ptr +
453+
tcb->adj_stack_size) - sp;
454+
phdr->p_vaddr = sp;
455+
}
456+
#ifdef CONFIG_STACK_COLORATION
457+
else
458+
{
459+
phdr->p_filesz = up_check_tcbstack(tcb);
460+
phdr->p_vaddr = (uintptr_t)tcb->stack_base_ptr +
461+
(tcb->adj_stack_size - phdr->p_filesz);
462+
}
463+
#endif
430464
}
431-
else
465+
466+
if (phdr->p_vaddr == 0)
432467
{
433468
phdr->p_vaddr = (uintptr_t)tcb->stack_alloc_ptr;
434469
phdr->p_filesz = tcb->adj_stack_size +

0 commit comments

Comments
 (0)