[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