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);

Reply via email to