aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenry Kroll III <henry@comptune.com>2010-04-24 03:28:54 -0700
committerHenry Kroll III <henry@comptune.com>2010-04-24 03:28:54 -0700
commit2ab42855cb2e1501fcc892f3159f9a957b4f538f (patch)
tree2a346a62842cbea0b4a5a8f2247b2ce9c64fc2af
parenta4ed587f6104ce2e8cb75ef9900bf17644f428bf (diff)
downloadtinycc-2ab42855cb2e1501fcc892f3159f9a957b4f538f.tar.gz
tinycc-2ab42855cb2e1501fcc892f3159f9a957b4f538f.tar.bz2
make --with-selinux work with libtcc, too
-rw-r--r--libtcc.c5
-rw-r--r--tcc.h4
-rw-r--r--tccrun.c60
3 files changed, 35 insertions, 34 deletions
diff --git a/libtcc.c b/libtcc.c
index 62c252d..f0da4de 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 66ac779..7571f3e 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 f2946a0..f04412c 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);
}