Author: brooks
Date: Wed Nov 13 21:51:55 2019
New Revision: 354694
URL: https://svnweb.freebsd.org/changeset/base/354694

Log:
  elf_aux_info: Add support for AT_EXECPATH.
  
  Reviewed by:  emaste, sef
  MFC after:    3 days
  Sponsored by: DARPA, AFRL
  Differential Revision:        https://reviews.freebsd.org/D22353

Modified:
  head/lib/libc/gen/auxv.3
  head/lib/libc/gen/auxv.c
  head/sys/sys/param.h

Modified: head/lib/libc/gen/auxv.3
==============================================================================
--- head/lib/libc/gen/auxv.3    Wed Nov 13 21:49:46 2019        (r354693)
+++ head/lib/libc/gen/auxv.3    Wed Nov 13 21:51:55 2019        (r354694)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd April 25, 2019
+.Dd November 13, 2019
 .Dt ELF_AUX_INFO 3
 .Os
 .Sh NAME
@@ -48,6 +48,10 @@ can be requested:
 .Bl -tag -width AT_OSRELDATE
 .It AT_CANARY
 The canary value for SSP.
+.It AT_EXECPATH
+The path of executed program.
+This will not be present if the process was initialized by
+.Xr fexecve 2 .
 .It AT_HWCAP
 CPU / hardware feature flags.
 .It AT_HWCAP2

Modified: head/lib/libc/gen/auxv.c
==============================================================================
--- head/lib/libc/gen/auxv.c    Wed Nov 13 21:49:46 2019        (r354693)
+++ head/lib/libc/gen/auxv.c    Wed Nov 13 21:51:55 2019        (r354694)
@@ -69,7 +69,7 @@ __init_elf_aux_vector(void)
 static pthread_once_t aux_once = PTHREAD_ONCE_INIT;
 static int pagesize, osreldate, canary_len, ncpus, pagesizes_len;
 static int hwcap_present, hwcap2_present;
-static char *canary, *pagesizes;
+static char *canary, *pagesizes, *execpath;
 static void *timekeep;
 static u_long hwcap, hwcap2;
 
@@ -88,6 +88,10 @@ init_aux(void)
                        canary_len = aux->a_un.a_val;
                        break;
 
+               case AT_EXECPATH:
+                       execpath = (char *)(aux->a_un.a_ptr);
+                       break;
+
                case AT_HWCAP:
                        hwcap_present = 1;
                        hwcap = (u_long)(aux->a_un.a_val);
@@ -146,6 +150,18 @@ _elf_aux_info(int aux, void *buf, int buflen)
                        res = 0;
                } else
                        res = ENOENT;
+               break;
+       case AT_EXECPATH:
+               if (execpath == NULL)
+                       res = ENOENT;
+               else if (buf == NULL)
+                       res = EINVAL;
+               else {
+                       if (strlcpy(buf, execpath, buflen) >= buflen)
+                               res = EINVAL;
+                       else
+                               res = 0;
+               }
                break;
        case AT_HWCAP:
                if (hwcap_present && buflen == sizeof(u_long)) {

Modified: head/sys/sys/param.h
==============================================================================
--- head/sys/sys/param.h        Wed Nov 13 21:49:46 2019        (r354693)
+++ head/sys/sys/param.h        Wed Nov 13 21:51:55 2019        (r354694)
@@ -60,7 +60,7 @@
  *             in the range 5 to 9.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 1300056      /* Master, propagated to newvers */
+#define __FreeBSD_version 1300057      /* Master, propagated to newvers */
 
 /*
  * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to