X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=jail%2Felf.c;h=7c6076afb6a7f305695163ede2a796af73f9cd5e;hp=136789e1300dce1b924c13edd91931082d767bd0;hb=fa5ce1c2b4fe3fa6bb4bbc6697961655b952d8d4;hpb=15ff8b1d09187c11b1331f811cc75b0dd2076827 diff --git a/jail/elf.c b/jail/elf.c index 136789e..7c6076a 100644 --- a/jail/elf.c +++ b/jail/elf.c @@ -81,7 +81,7 @@ int lib_open(char **fullpath, const char *file) list_for_each_entry(p, &library_paths, list) { snprintf(path, sizeof(path), "%s/%s", p->path, file); - fd = open(path, O_RDONLY); + fd = open(path, O_RDONLY|O_CLOEXEC); if (fd >= 0) { *fullpath = strdup(path); break; @@ -234,6 +234,7 @@ int elf_load_deps(const char *path, const char *map) { unsigned int dyn_offset, dyn_size; unsigned int load_offset, load_vaddr; + unsigned int interp_offset; if (elf_find_section(map, PT_LOAD, &load_offset, NULL, &load_vaddr)) { ERROR("failed to load the .load section from %s\n", path); @@ -245,6 +246,10 @@ int elf_load_deps(const char *path, const char *map) return -1; } + if (elf_find_section(map, PT_INTERP, &interp_offset, NULL, NULL) == 0) { + add_path_and_deps(map+interp_offset, 1, -1, 0); + } + int clazz = map[EI_CLASS]; if (clazz == ELFCLASS32)