Re: AMD64 14.0-CURRENT memory layout changes
- Reply: Paul Floyd : "Re: AMD64 14.0-CURRENT memory layout changes"
- In reply to: Paul Floyd : "Re: AMD64 14.0-CURRENT memory layout changes"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 18 Oct 2022 15:36:07 UTC
On Tue, Oct 18, 2022 at 02:13:46PM +0200, Paul Floyd wrote:
>
> >
> > How is 14.0 working out what address to use for the stack?
> > (The above is with ASLR all off)
>
>
> Answering my own question:
>
> it's in auxv (from __thr_get_main_stack_base)
>
>
> /usr/include/sys/elf_common.h:#define AT_USRSTACKBASE 35 /* Top
> of user stack */
>
> I haven't yet added this (or AT_USRSTACKLIM) to the client auxv that
> Valgrind synthesizes.
>
>
> I'm still not certain that will fix it - I would have expected
> __thr_get_main_stack_base to fallback to using sysctl.
I think this is a compatibility bug in elf_aux_info(). The values of
AT_USRSTACKBASE and AT_USRSTACKLIM can never legitimately be zero, I
think, so we can use that to test.
diff --git a/lib/libc/gen/auxv.c b/lib/libc/gen/auxv.c
index af59a2dda90a..2f043f8814cf 100644
--- a/lib/libc/gen/auxv.c
+++ b/lib/libc/gen/auxv.c
@@ -381,15 +381,21 @@ _elf_aux_info(int aux, void *buf, int buflen)
break;
case AT_USRSTACKBASE:
if (buflen == sizeof(u_long)) {
- *(u_long *)buf = usrstackbase;
- res = 0;
+ if (usrstackbase != 0) {
+ *(u_long *)buf = usrstackbase;
+ res = 0;
+ } else
+ res = ENOENT;
} else
res = EINVAL;
break;
case AT_USRSTACKLIM:
if (buflen == sizeof(u_long)) {
- *(u_long *)buf = usrstacklim;
- res = 0;
+ if (usrstacklim != 0) {
+ *(u_long *)buf = usrstacklim;
+ res = 0;
+ } else
+ res = ENOENT;
} else
res = EINVAL;
break;