Hello - doit() was not free()'ing memory or close()'ing the file descriptor if realpath() failed or dlopen() returned NULL.
This diff just moves close() and free() up once we are done using them. Index: ldd/ldd.c =================================================================== RCS file: /cvs/src/libexec/ld.so/ldd/ldd.c,v retrieving revision 1.15 diff -u -p -r1.15 ldd.c --- ldd/ldd.c 29 Apr 2011 07:19:19 -0000 1.15 +++ ldd/ldd.c 5 Jul 2013 18:12:43 -0000 @@ -126,12 +126,14 @@ doit(char *name) free(phdr); return 1; } + close(fd); for (i = 0; i < ehdr.e_phnum; i++) if (phdr[i].p_type == PT_INTERP) { interp = 1; break; } + free(phdr); if (ehdr.e_type == ET_DYN && !interp) { printf("%s:\n", name); @@ -144,13 +146,8 @@ doit(char *name) printf("%s\n", dlerror()); return 1; } - close(fd); - free(phdr); return 0; } - - close(fd); - free(phdr); if (i == ehdr.e_phnum) { warnx("%s: not a dynamic executable", name);