Module Name: src Committed By: christos Date: Thu Jul 22 17:39:53 UTC 2021
Modified Files: src/usr.bin/ldd: ldd.c ldd.h ldd_elfxx.c Log Message: rtld expects an absolute path in execname provided via AUXV in order to handle $ORIGIN properly and checks for that. Since we are calling its guts directly, provide one. To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/usr.bin/ldd/ldd.c cvs rdiff -u -r1.7 -r1.8 src/usr.bin/ldd/ldd.h src/usr.bin/ldd/ldd_elfxx.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/ldd/ldd.c diff -u src/usr.bin/ldd/ldd.c:1.23 src/usr.bin/ldd/ldd.c:1.24 --- src/usr.bin/ldd/ldd.c:1.23 Mon Dec 25 00:08:49 2017 +++ src/usr.bin/ldd/ldd.c Thu Jul 22 13:39:52 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: ldd.c,v 1.23 2017/12/25 05:08:49 maya Exp $ */ +/* $NetBSD: ldd.c,v 1.24 2021/07/22 17:39:52 christos Exp $ */ /*- * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: ldd.c,v 1.23 2017/12/25 05:08:49 maya Exp $"); +__RCSID("$NetBSD: ldd.c,v 1.24 2021/07/22 17:39:52 christos Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -123,6 +123,7 @@ main(int argc, char **argv) { const char *fmt1 = NULL, *fmt2 = NULL; int c, exit_status = EXIT_SUCCESS; + char cwd[MAXPATHLEN], path[MAXPATHLEN]; #ifdef DEBUG debug = 1; @@ -154,22 +155,28 @@ main(int argc, char **argv) usage(); /*NOTREACHED*/ } + if (getcwd(cwd, sizeof(cwd)) == NULL) + err(EXIT_FAILURE, "Can't get working directory"); for (; argc != 0; argc--, argv++) { int fd; + if (**argv != '/') + snprintf(path, sizeof(path), "%s/%s", cwd, *argv); + else + strlcpy(path, *argv, sizeof(path)); fd = open(*argv, O_RDONLY); if (fd == -1) { exit_status = EXIT_FAILURE; warn("%s", *argv); continue; } - if (elf_ldd(fd, *argv, fmt1, fmt2) == -1 + if (elf_ldd(fd, *argv, path, fmt1, fmt2) == -1 /* Alpha never had 32 bit support. */ #if (defined(_LP64) && !defined(ELF64_ONLY)) || defined(MIPS_N32) - && elf32_ldd(fd, *argv, fmt1, fmt2) == -1 + && elf32_ldd(fd, *argv, path, fmt1, fmt2) == -1 #if defined(__mips__) && 0 /* XXX this is still hosed for some reason */ - && elf32_ldd_compat(fd, *argv, fmt1, fmt2) == -1 + && elf32_ldd_compat(fd, *argv, path, fmt1, fmt2) == -1 #endif #endif ) { Index: src/usr.bin/ldd/ldd.h diff -u src/usr.bin/ldd/ldd.h:1.7 src/usr.bin/ldd/ldd.h:1.8 --- src/usr.bin/ldd/ldd.h:1.7 Sat Jul 7 20:53:44 2012 +++ src/usr.bin/ldd/ldd.h Thu Jul 22 13:39:53 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: ldd.h,v 1.7 2012/07/08 00:53:44 matt Exp $ */ +/* $NetBSD: ldd.h,v 1.8 2021/07/22 17:39:53 christos Exp $ */ /* * Copyright (c) 2008 Matthew R. Green @@ -28,14 +28,14 @@ * SUCH DAMAGE. */ -int elf32_ldd(int, char *, const char *, const char *); +int elf32_ldd(int, char *, char *, const char *, const char *); #ifdef _LP64 #define LDD_ELF64 #endif #ifdef LDD_ELF64 -int elf64_ldd(int, char *, const char *, const char *); +int elf64_ldd(int, char *, char *, const char *, const char *); #define elf_ldd elf64_ldd #elif defined(ELF32_COMPAT) #define elf_ldd elf32_compat_ldd Index: src/usr.bin/ldd/ldd_elfxx.c diff -u src/usr.bin/ldd/ldd_elfxx.c:1.7 src/usr.bin/ldd/ldd_elfxx.c:1.8 --- src/usr.bin/ldd/ldd_elfxx.c:1.7 Tue Jan 10 16:11:25 2017 +++ src/usr.bin/ldd/ldd_elfxx.c Thu Jul 22 13:39:53 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: ldd_elfxx.c,v 1.7 2017/01/10 21:11:25 christos Exp $ */ +/* $NetBSD: ldd_elfxx.c,v 1.8 2021/07/22 17:39:53 christos Exp $ */ /*- * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: ldd_elfxx.c,v 1.7 2017/01/10 21:11:25 christos Exp $"); +__RCSID("$NetBSD: ldd_elfxx.c,v 1.8 2021/07/22 17:39:53 christos Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -93,7 +93,7 @@ static void fmtprint(const char *, Obj_E * returns 0 on success and -1 on failure. */ int -ELFNAME(ldd)(int fd, char *path, const char *fmt1, const char *fmt2) +ELFNAME(ldd)(int fd, char *prog, char *path, const char *fmt1, const char *fmt2) { struct stat st; @@ -132,7 +132,7 @@ ELFNAME(ldd)(int fd, char *path, const c (void) _rtld_load_needed_objects(_rtld_objmain, 0); if (fmt1 == NULL) - printf("%s:\n", _rtld_objmain->path); + printf("%s:\n", prog); main_local = path; main_progname = _rtld_objmain->path; print_needed(_rtld_objmain, fmt1, fmt2);