[Glibc-bsd-commits] r3036 - trunk/glibc-ports/kfreebsd

Petr Salinger ps-guest at alioth.debian.org
Tue Apr 27 11:23:37 UTC 2010


Author: ps-guest
Date: 2010-04-27 11:23:36 +0000 (Tue, 27 Apr 2010)
New Revision: 3036

Modified:
   trunk/glibc-ports/kfreebsd/dl-origin.c
Log:
try harder to get $ORIGIN handling working in chroots with bind/nullf mounts ...



Modified: trunk/glibc-ports/kfreebsd/dl-origin.c
===================================================================
--- trunk/glibc-ports/kfreebsd/dl-origin.c	2010-04-26 14:12:31 UTC (rev 3035)
+++ trunk/glibc-ports/kfreebsd/dl-origin.c	2010-04-27 11:23:36 UTC (rev 3036)
@@ -28,31 +28,50 @@
 
 #include <dl-dst.h>
 
-/* On Linux >= 2.1 systems which have the dcache implementation we can get
-   the path of the application from the /proc/self/exe symlink.  Try this
-   first and fall back on the generic method if necessary.  */
-
-
 const char *_self_program_name_from_auxv attribute_hidden;
 
 static int
 _dl_self_name(char *buf, int buflen)
 {
-  int len;
-  
+  int len, wdlen;
+
+  /* try /proc/self/exe symlink. */  
   len = __readlink("/proc/self/exe", buf, buflen);
 
   if (len > 0 && buf[0] == '/')
     return len;
 
-  if (_self_program_name_from_auxv)
+  if (!_self_program_name_from_auxv)
+    return -1;
+
+  len = strlen(_self_program_name_from_auxv);
+  if (len > 0 && _self_program_name_from_auxv[0] == '/')
   {
-    strncpy(buf, _self_program_name_from_auxv, buflen);
+    /* absolute file name */
+    if (len < buflen)
+    {
+      strcpy(buf, _self_program_name_from_auxv);
+      return len;
+    }
+    memcpy(buf, _self_program_name_from_auxv, buflen);
     buf[buflen - 1] = 0;
-    return strlen(buf);
+    return buflen - 1;
   };
   
-  return -1;
+  /* relative file name, do our best */
+  if (NULL == __getcwd(buf, buflen))
+    return -1;
+  
+  wdlen = strlen(buf);
+  buf[wdlen] = '/';
+  if ((wdlen + len + 1) < buflen)
+  {
+    strcpy(buf + wdlen + 1, _self_program_name_from_auxv);
+    return wdlen + len + 1;
+  }
+  memcpy(buf + wdlen + 1, _self_program_name_from_auxv, buflen - wdlen - 1);  
+  buf[buflen - 1] = 0;
+  return buflen - 1;  
 }
 
 
@@ -60,7 +79,7 @@
 const char *
 _dl_get_origin (void)
 {
-  char linkval[PATH_MAX];
+  char linkval[2*PATH_MAX];
   char *result;
   int len;
 




More information about the Glibc-bsd-commits mailing list