summaryrefslogtreecommitdiffstats
path: root/usr.bin/ldd
diff options
context:
space:
mode:
authorjdp <jdp@FreeBSD.org>1998-08-30 18:30:59 +0000
committerjdp <jdp@FreeBSD.org>1998-08-30 18:30:59 +0000
commitb192d1711839c5aea478f92cf244a319af5af862 (patch)
tree9bb7e5aedafa40e992e9105263a1a38baba20b1d /usr.bin/ldd
parentbd87efc7530d42a0f1c2a903f752342aae4f95fa (diff)
downloadFreeBSD-src-b192d1711839c5aea478f92cf244a319af5af862.zip
FreeBSD-src-b192d1711839c5aea478f92cf244a319af5af862.tar.gz
Fix a bug which caused ldd to execute scripts listed on its command
line, instead of skipping them. Also make a few minor cleanups. PR: bin/7783
Diffstat (limited to 'usr.bin/ldd')
-rw-r--r--usr.bin/ldd/ldd.c57
1 files changed, 28 insertions, 29 deletions
diff --git a/usr.bin/ldd/ldd.c b/usr.bin/ldd/ldd.c
index 31a7a67..3a4f3f6 100644
--- a/usr.bin/ldd/ldd.c
+++ b/usr.bin/ldd/ldd.c
@@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: ldd.c,v 1.14 1997/09/02 21:54:39 jdp Exp $
+ * $Id: ldd.c,v 1.15 1998/05/01 08:40:11 dfr Exp $
*/
#include <sys/types.h>
@@ -108,39 +108,40 @@ char *argv[];
setenv("LD_TRACE_LOADED_OBJECTS_FMT2", fmt2, 1);
rval = 0;
- while (argc--) {
+ for ( ; argc > 0; argc--, argv++) {
int fd;
- struct exec hdr;
+ union {
+ struct exec aout;
+ Elf32_Ehdr elf;
+ } hdr;
+ int n;
int status;
+ int file_ok;
if ((fd = open(*argv, O_RDONLY, 0)) < 0) {
warn("%s", *argv);
rval |= 1;
- argv++;
continue;
}
- if (read(fd, &hdr, sizeof hdr) != sizeof hdr) {
- warnx("%s: can't read program header", *argv);
+ if ((n = read(fd, &hdr, sizeof hdr)) == -1) {
+ warn("%s: can't read program header", *argv);
(void)close(fd);
rval |= 1;
- argv++;
continue;
}
- if (!N_BADMAG(hdr)) {
+ file_ok = 1;
+ if (n >= sizeof hdr.aout && !N_BADMAG(hdr.aout)) {
/* a.out file */
- if ((N_GETFLAG(hdr) & EX_DPMASK) != EX_DYNAMIC
+ if ((N_GETFLAG(hdr.aout) & EX_DPMASK) != EX_DYNAMIC
#if 1 /* Compatibility */
- || hdr.a_entry < __LDPGSZ
+ || hdr.aout.a_entry < __LDPGSZ
#endif
) {
warnx("%s: not a dynamic executable", *argv);
- (void)close(fd);
- rval |= 1;
- argv++;
- continue;
+ file_ok = 0;
}
- } else if (IS_ELF(*(Elf32_Ehdr*)&hdr)) {
+ } else if (n >= sizeof hdr.elf && IS_ELF(hdr.elf)) {
Elf32_Ehdr ehdr;
Elf32_Phdr phdr;
int dynamic = 0, i;
@@ -148,33 +149,32 @@ char *argv[];
lseek(fd, 0, SEEK_SET);
if (read(fd, &ehdr, sizeof ehdr) != sizeof ehdr) {
warnx("%s: can't read program header", *argv);
- (void)close(fd);
- rval |= 1;
- argv++;
- continue;
+ file_ok = 0;
}
lseek(fd, 0, ehdr.e_phoff);
for (i = 0; i < ehdr.e_phnum; i++) {
if (read(fd, &phdr, ehdr.e_phentsize)
!= sizeof phdr) {
- warnx("%s: can't read program header", *argv);
- (void)close(fd);
- rval |= 1;
- argv++;
- continue;
+ warnx("%s: can't read program header",
+ *argv);
+ file_ok = 0;
}
if (phdr.p_type == PT_DYNAMIC)
dynamic = 1;
}
if (!dynamic) {
warnx("%s: not a dynamic executable", *argv);
- (void)close(fd);
- rval |= 1;
- argv++;
- continue;
+ file_ok = 0;
}
+ } else {
+ warnx("%s: not a dynamic executable", *argv);
+ file_ok = 0;
}
(void)close(fd);
+ if (!file_ok) {
+ rval |= 1;
+ continue;
+ }
setenv("LD_TRACE_LOADED_OBJECTS_PROGNAME", *argv, 1);
if (fmt1 == NULL && fmt2 == NULL)
@@ -206,7 +206,6 @@ char *argv[];
perror(*argv);
_exit(1);
}
- argv++;
}
return rval;
OpenPOWER on IntegriCloud