From 2ab42855cb2e1501fcc892f3159f9a957b4f538f Mon Sep 17 00:00:00 2001 From: Henry Kroll III Date: Sat, 24 Apr 2010 03:28:54 -0700 Subject: [PATCH] make --with-selinux work with libtcc, too --- libtcc.c | 5 +++++ tcc.h | 4 ++++ tccrun.c | 60 ++++++++++++++++++++++++++---------------------------------- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/libtcc.c b/libtcc.c index 62c252d6..f0da4deb 100644 --- a/libtcc.c +++ b/libtcc.c @@ -1038,7 +1038,12 @@ LIBTCCAPI void tcc_delete(TCCState *s1) dynarray_reset(&s1->sysinclude_paths, &s1->nb_sysinclude_paths); tcc_free(s1->tcc_lib_path); +#ifdef HAVE_SELINUX + munmap (s1->write_mem, s1->mem_size); + munmap (s1->runtime_mem, s1->mem_size); +#else tcc_free(s1->runtime_mem); +#endif tcc_free(s1); } diff --git a/tcc.h b/tcc.h index 66ac779b..7571f3e0 100644 --- a/tcc.h +++ b/tcc.h @@ -521,6 +521,10 @@ struct TCCState { /* for tcc_relocate */ int runtime_added; void *runtime_mem; +#ifdef HAVE_SELINUX + void *write_mem; + unsigned long mem_size; +#endif struct InlineFunc **inline_fns; int nb_inline_fns; diff --git a/tccrun.c b/tccrun.c index f2946a05..f04412c0 100644 --- a/tccrun.c +++ b/tccrun.c @@ -37,12 +37,33 @@ static int tcc_relocate_ex(TCCState *s1, void *ptr); int tcc_relocate(TCCState *s1) { int ret; - +#ifdef HAVE_SELINUX + char tmpfname[] = "/tmp/.tccrunXXXXXX"; + int fd = mkstemp (tmpfname); + unlink (tmpfname); ftruncate (fd, 1000); + if ((ret= tcc_relocate_ex(s1,NULL)) < 0)return -1; + s1->mem_size=ret; + /* Use mmap instead of malloc for Selinux */ + s1->write_mem = mmap (NULL, ret, PROT_READ|PROT_WRITE, + MAP_SHARED, fd, 0); + if(s1->write_mem == MAP_FAILED){ + error("/tmp not writeable"); + return -1; + } + s1->runtime_mem = mmap (NULL, ret, PROT_READ|PROT_EXEC, + MAP_SHARED, fd, 0); + if(s1->runtime_mem == MAP_FAILED){ + error("/tmp not executable"); + return -1; + } + ret = tcc_relocate_ex(s1, s1->write_mem); +#else ret = tcc_relocate_ex(s1, NULL); if (-1 != ret) { s1->runtime_mem = tcc_malloc(ret); ret = tcc_relocate_ex(s1, s1->runtime_mem); } +#endif return ret; } @@ -50,34 +71,10 @@ int tcc_relocate(TCCState *s1) int tcc_run(TCCState *s1, int argc, char **argv) { int (*prog_main)(int, char **); - int ret; -#ifdef HAVE_SELINUX - int rret; - void *ptr,*writep; - char tmpfname[] = "/tmp/.tccrunXXXXXX"; - int fd = mkstemp (tmpfname); - unlink (tmpfname); - ftruncate (fd, 1000); - if ((rret= tcc_relocate_ex(s1,NULL)) < 0) - return -1; - /* Use mmap instead of malloc for Selinux */ - writep = mmap (NULL, rret, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, 0); - if(writep == MAP_FAILED){ - error("/tmp not writeable"); - return -1; - } - ptr = mmap (NULL, rret, PROT_READ|PROT_EXEC, - MAP_SHARED, fd, 0); - if(ptr == MAP_FAILED){ - error("/tmp not executable"); - return -1; - } - tcc_relocate_ex(s1, writep); -#else + if (tcc_relocate(s1) < 0) return -1; -#endif + prog_main = tcc_get_symbol_err(s1, "main"); #ifdef CONFIG_TCC_BACKTRACE @@ -89,6 +86,7 @@ int tcc_run(TCCState *s1, int argc, char **argv) if (s1->do_bounds_check) { void (*bound_init)(void); void (*bound_exit)(void); + int ret; /* set error function */ rt_bound_error_msg = tcc_get_symbol_err(s1, "__bound_error_msg"); rt_prog_main = prog_main; @@ -108,13 +106,7 @@ int tcc_run(TCCState *s1, int argc, char **argv) if (p) *p = 0; } #endif - ret=(*prog_main)(argc, argv); -#ifdef HAVE_SELINUX - munmap (writep, rret); - munmap (ptr, rret); - -#endif - return ret; + return (*prog_main)(argc, argv); } -- 2.11.4.GIT