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

Reply via email to