| @@ -50,10 +50,34 @@ int tcc_relocate(TCCState *s1) · 49 unmodified lines |
| 50 | 50 | int tcc_run(TCCState *s1, int argc, char **argv) |
| 51 | 51 | { |
| 52 | 52 | int (*prog_main)(int, char **); |
| 53 | | − |
| 53 | + int ret; |
| 54 | +#ifdef HAVE_SELINUX |
| 55 | + int rret; |
| 56 | + void *ptr,*writep; |
| 57 | + char tmpfname[] = "/tmp/.tccrunXXXXXX"; |
| 58 | + int fd = mkstemp (tmpfname); |
| 59 | + unlink (tmpfname); |
| 60 | + ftruncate (fd, 1000); |
| 61 | + if ((rret= tcc_relocate_ex(s1,NULL)) < 0) |
| 62 | + return -1; |
| 63 | + /* Use mmap instead of malloc for Selinux */ |
| 64 | + writep = mmap (NULL, rret, PROT_READ|PROT_WRITE, |
| 65 | + MAP_SHARED, fd, 0); |
| 66 | + if(writep == MAP_FAILED){ |
| 67 | + error("/tmp not writeable"); |
| 68 | + return -1; |
| 69 | + } |
| 70 | + ptr = mmap (NULL, rret, PROT_READ|PROT_EXEC, |
| 71 | + MAP_SHARED, fd, 0); |
| 72 | + if(ptr == MAP_FAILED){ |
| 73 | + error("/tmp not executable"); |
| 74 | + return -1; |
| 75 | + } |
| 76 | + tcc_relocate_ex(s1, writep); |
| 77 | +#else |
| 54 | 78 | if (tcc_relocate(s1) < 0) |
| 55 | 79 | return -1; |
| 56 | | − |
| 80 | +#endif |
| 57 | 81 | prog_main = tcc_get_symbol_err(s1, "main"); |
| 58 | 82 | |
| 59 | 83 | #ifdef CONFIG_TCC_BACKTRACE |
| @@ -65,7 +89,6 @@ int tcc_run(TCCState *s1, int argc, char **argv) · 5 unmodified lines |
| 65 | 89 | if (s1->do_bounds_check) { |
| 66 | 90 | void (*bound_init)(void); |
| 67 | 91 | void (*bound_exit)(void); |
| 68 | | − int ret; |
| 69 | 92 | /* set error function */ |
| 70 | 93 | rt_bound_error_msg = tcc_get_symbol_err(s1, "__bound_error_msg"); |
| 71 | 94 | rt_prog_main = prog_main; |
| @@ -85,7 +108,13 @@ int tcc_run(TCCState *s1, int argc, char **argv) · 13 unmodified lines |
| 85 | 108 | if (p) *p = 0; |
| 86 | 109 | } |
| 87 | 110 | #endif |
| 88 | | − return (*prog_main)(argc, argv); |
| 111 | + ret=(*prog_main)(argc, argv); |
| 112 | +#ifdef HAVE_SELINUX |
| 113 | + munmap (writep, rret); |
| 114 | + munmap (ptr, rret); |
| 115 | + |
| 116 | +#endif |
| 117 | + return ret; |
| 89 | 118 | } |
| 90 | 119 | |
| 91 | 120 | |