[Bug 234523] elf_aux_info() doesn't expose all AT_* vectors
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Mon Dec 31 11:20:15 UTC 2018
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=234523
Bug ID: 234523
Summary: elf_aux_info() doesn't expose all AT_* vectors
Product: Base System
Version: CURRENT
Hardware: Any
OS: Any
Status: New
Severity: Affects Only Me
Priority: ---
Component: bin
Assignee: bugs at FreeBSD.org
Reporter: jbeich at FreeBSD.org
KERN_PROC_AUXV allows accessing arbitrary AT_* vectors but libc exposes only
few via elf_aux_info(3). For example, one may want to rely on libc caching
AT_EXECPATH instead of retrieving KERN_PROC_PATHNAME directly.
$ cat elf_aux_info.c
#include <sys/auxv.h>
#include <limits.h>
#include <stdio.h>
int main()
{
char exe[PATH_MAX + 1] = {0};
elf_aux_info(AT_EXECPATH, &exe, sizeof(exe));
printf("%s\n", exe);
return 0;
}
$ make elf_aux_info
$ ./elf_aux_info
$
vs.
$ cat getauxval_naive.c
#include <sys/param.h>
#include <sys/sysctl.h>
#include <elf.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
static unsigned long getauxval(unsigned long type) {
Elf_Auxinfo auxv[AT_COUNT];
size_t len = sizeof(auxv);
int mib[] = {
CTL_KERN,
KERN_PROC,
KERN_PROC_AUXV,
getpid(),
};
if (sysctl(mib, nitems(mib), auxv, &len, NULL, 0) != -1) {
for (size_t i = 0; i < nitems(auxv); i++)
if ((unsigned long)auxv[i].a_type == type)
return auxv[i].a_un.a_val;
errno = ENOENT;
}
return 0;
}
int main()
{
printf("%s\n", (char *)getauxval(AT_EXECPATH));
return 0;
}
$ make getauxval_naive
$ ./getauxval_naive
/home/foo/getauxval_naive
$
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-bugs
mailing list