use AT_EXECFN, if available, for dynamic linker to identify main program
authorRich Felker <dalias@aerifal.cx>
Fri, 23 Aug 2013 18:14:47 +0000 (14:14 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 23 Aug 2013 18:14:47 +0000 (14:14 -0400)
fallback to argv[0] as before. unlike argv[0], AT_EXECFN was a valid
(but possibly relative) pathname for the new program image at the time
the execve syscall was made.

as a special case, ignore AT_EXECFN if it begins with "/proc/", in
order not to give bogus (and possibly harmful) results when fexecve
was used.

src/ldso/dynlink.c

index 6f23fa549ef705ed85e6063529c0327a177a3b1f..cbddeba784acd6ba6ec12fe5af684c1a4cb86300 100644 (file)
@@ -1016,7 +1016,11 @@ void *__dynlink(int argc, char **argv)
                }
                if (app->tls_size) app->tls_image = (char *)app->base + tls_image;
                if (interp_off) lib->name = (char *)app->base + interp_off;
-               app->name = argv[0];
+               if ((aux[0] & (1UL<<AT_EXECFN))
+                   && strncmp((char *)aux[AT_EXECFN], "/proc/", 6))
+                       app->name = (char *)aux[AT_EXECFN];
+               else
+                       app->name = argv[0];
                app->kernel_mapped = 1;
                app->dynv = (void *)(app->base + find_dyn(
                        (void *)aux[AT_PHDR], aux[AT_PHNUM], aux[AT_PHENT]));