rtld dump_auxv: be pedantic and distiguish between auxv union members based on format

Reviewed by:	jrtc27
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2021-11-13 21:04:51 +02:00
parent 3a902ef253
commit b61bce17f3

View File

@ -6105,6 +6105,15 @@ static const struct auxfmt {
AUXFMT(AT_FXRNG, "%p"),
};
static bool
is_ptr_fmt(const char *fmt)
{
char last;
last = fmt[strlen(fmt) - 1];
return (last == 'p' || last == 's');
}
static void
dump_auxv(Elf_Auxinfo **aux_info)
{
@ -6120,7 +6129,13 @@ dump_auxv(Elf_Auxinfo **aux_info)
if (fmt->fmt == NULL)
continue;
rtld_fdprintf(STDOUT_FILENO, "%s:\t", fmt->name);
rtld_fdprintfx(STDOUT_FILENO, fmt->fmt, auxp->a_un.a_ptr);
if (is_ptr_fmt(fmt->fmt)) {
rtld_fdprintfx(STDOUT_FILENO, fmt->fmt,
auxp->a_un.a_ptr);
} else {
rtld_fdprintfx(STDOUT_FILENO, fmt->fmt,
auxp->a_un.a_val);
}
rtld_fdprintf(STDOUT_FILENO, "\n");
}
}