diff options
Diffstat (limited to 'ldso/util/ldd.c')
-rw-r--r-- | ldso/util/ldd.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/ldso/util/ldd.c b/ldso/util/ldd.c index 0cf3c798e..132457905 100644 --- a/ldso/util/ldd.c +++ b/ldso/util/ldd.c @@ -221,7 +221,7 @@ void locate_library_file(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *strtab, int static int add_library(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *strtab, int is_setuid, const char *s) { - struct library *cur, *prev, *newlib=lib_list; + struct library *cur, *newlib=lib_list; if (!s || !strlen(s)) return 1; @@ -254,9 +254,8 @@ static int add_library(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *strtab, int i if (!lib_list) { lib_list = newlib; } else { - for (cur = prev = lib_list; cur->next; prev=cur, cur=cur->next); /* nothing */ - cur = newlib; - prev->next = cur; + for (cur = lib_list; cur->next; cur=cur->next); /* nothing */ + cur->next = newlib; } return 0; } @@ -275,18 +274,17 @@ static void find_needed_libraries(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *st static void find_elf_interpreter(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *strtab, int is_setuid) { + static int been_there_done_that=0; Elf32_Phdr *phdr; + + if (been_there_done_that==1) + return; + been_there_done_that=1; phdr = elf_find_phdr_type(PT_INTERP, ehdr); if (phdr) { - struct library *cur, *prev, *newlib=lib_list; + struct library *cur, *newlib=lib_list; char *s = (char*)ehdr + phdr->p_offset; - for (cur = lib_list; cur; cur=cur->next) { - if(strcmp(cur->name, s)==0) { - /* Lib is already in the list */ - return; - } - } newlib = malloc(sizeof(struct library)); if (!newlib) return; @@ -300,9 +298,8 @@ static void find_elf_interpreter(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *str if (!lib_list) { lib_list = newlib; } else { - for (cur = prev = lib_list; cur->next; prev=cur, cur=cur->next); /* nothing */ - cur = newlib; - prev->next = cur; + for (cur = lib_list; cur->next; cur=cur->next); /* nothing */ + cur->next = newlib; } } } |