X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=jail%2Felf.c;h=c3a392c775b71cab2218381abfc9ff63166d25e3;hb=2b591e08ee7797300b33f2540e5dd4595828a772;hp=c19859987b8093de05fd3ba3d6d76889b182ef40;hpb=dfcfcca7baf2b22d8dac1a724bdb7dd9d52f4c05;p=project%2Fprocd.git diff --git a/jail/elf.c b/jail/elf.c index c198599..c3a392c 100644 --- a/jail/elf.c +++ b/jail/elf.c @@ -12,41 +12,32 @@ */ #define _GNU_SOURCE -#include #include -#include -#include -#include #include #include -#include -#include -#include -#include -#include -#include #include #include #include -#include #include #include #include +#include -#include -#include #include -#include -#include #include "elf.h" +#include "log.h" struct avl_tree libraries; static LIST_HEAD(library_paths); -void alloc_library_path(const char *path) +static void alloc_library_path(const char *path) { + struct stat s; + if (stat(path, &s)) + return; + struct library_path *p; char *_path; @@ -79,10 +70,10 @@ static void alloc_library(const char *path, const char *name) DEBUG("adding library %s/%s\n", path, name); } -static int elf_open(char **dir, char *file) +static int elf_open(char **dir, const char *file) { struct library_path *p; - char path[256]; + char path[PATH_MAX]; int fd = -1; *dir = NULL; @@ -105,10 +96,10 @@ static int elf_open(char **dir, char *file) return fd; } -char* find_lib(char *file) +const char* find_lib(const char *file) { struct library *l; - static char path[256]; + static char path[PATH_MAX]; const char *p; l = avl_find_element(&libraries, file, l, avl); @@ -124,7 +115,7 @@ char* find_lib(char *file) return path; } -static int elf64_find_section(char *map, unsigned int type, unsigned int *offset, unsigned int *size, unsigned int *vaddr) +static int elf64_find_section(const char *map, unsigned int type, unsigned int *offset, unsigned int *size, unsigned int *vaddr) { Elf64_Ehdr *e; Elf64_Phdr *ph; @@ -147,7 +138,7 @@ static int elf64_find_section(char *map, unsigned int type, unsigned int *offset return -1; } -static int elf32_find_section(char *map, unsigned int type, unsigned int *offset, unsigned int *size, unsigned int *vaddr) +static int elf32_find_section(const char *map, unsigned int type, unsigned int *offset, unsigned int *size, unsigned int *vaddr) { Elf32_Ehdr *e; Elf32_Phdr *ph; @@ -170,7 +161,7 @@ static int elf32_find_section(char *map, unsigned int type, unsigned int *offset return -1; } -static int elf_find_section(char *map, unsigned int type, unsigned int *offset, unsigned int *size, unsigned int *vaddr) +static int elf_find_section(const char *map, unsigned int type, unsigned int *offset, unsigned int *size, unsigned int *vaddr) { int clazz = map[EI_CLASS]; @@ -184,10 +175,10 @@ static int elf_find_section(char *map, unsigned int type, unsigned int *offset, return -1; } -static int elf32_scan_dynamic(char *map, int dyn_offset, int dyn_size, int load_offset) +static int elf32_scan_dynamic(const char *map, int dyn_offset, int dyn_size, int load_offset) { Elf32_Dyn *dynamic = (Elf32_Dyn *) (map + dyn_offset); - char *strtab = NULL; + const char *strtab = NULL; while ((void *) dynamic < (void *) (map + dyn_offset + dyn_size)) { Elf32_Dyn *curr = dynamic; @@ -218,10 +209,10 @@ static int elf32_scan_dynamic(char *map, int dyn_offset, int dyn_size, int load_ return 0; } -static int elf64_scan_dynamic(char *map, int dyn_offset, int dyn_size, int load_offset) +static int elf64_scan_dynamic(const char *map, int dyn_offset, int dyn_size, int load_offset) { Elf64_Dyn *dynamic = (Elf64_Dyn *) (map + dyn_offset); - char *strtab = NULL; + const char *strtab = NULL; while ((void *) dynamic < (void *) (map + dyn_offset + dyn_size)) { Elf64_Dyn *curr = dynamic; @@ -252,7 +243,7 @@ static int elf64_scan_dynamic(char *map, int dyn_offset, int dyn_size, int load_ return 0; } -int elf_load_deps(char *library) +int elf_load_deps(const char *library) { unsigned int dyn_offset, dyn_size; unsigned int load_offset, load_vaddr; @@ -298,10 +289,12 @@ int elf_load_deps(char *library) if (dir) { alloc_library(dir, library); } else { - char *elf = strdup(library); + char *elf1 = strdup(library); + char *elf2 = strdup(library); - alloc_library(dirname(elf), basename(library)); - free(elf); + alloc_library(dirname(elf1), basename(elf2)); + free(elf1); + free(elf2); } clazz = map[EI_CLASS]; @@ -318,10 +311,10 @@ err_out: return ret; } -void load_ldso_conf(const char *conf) +static void load_ldso_conf(const char *conf) { FILE* fp = fopen(conf, "r"); - char line[256]; + char line[PATH_MAX]; if (!fp) { DEBUG("failed to open %s\n", conf); @@ -331,7 +324,7 @@ void load_ldso_conf(const char *conf) while (!feof(fp)) { int len; - if (!fgets(line, 256, fp)) + if (!fgets(line, sizeof(line), fp)) break; len = strlen(line); if (len < 2) @@ -357,13 +350,18 @@ void load_ldso_conf(const char *conf) load_ldso_conf(gl.gl_pathv[i]); globfree(&gl); } else { - struct stat s; - - if (stat(line, &s)) - continue; alloc_library_path(line); } } fclose(fp); } + +void init_library_search(void) +{ + avl_init(&libraries, avl_strcmp, false, NULL); + alloc_library_path("/lib"); + alloc_library_path("/lib64"); + alloc_library_path("/usr/lib"); + load_ldso_conf("/etc/ld.so.conf"); +}