From 64afc27fa138e355b4ca21dfd8f642e19f780f0d Mon Sep 17 00:00:00 2001 From: Ivan Denisov Date: Sun, 4 Oct 2015 01:26:32 +0700 Subject: [PATCH] more crossplatform memory protaction used (mmap), fix by: Alexander Shiryaev --- BlackBox/_Linux_/Lin/Rsrc/blackbox.c | 48 +++++++++++++++++++++------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/BlackBox/_Linux_/Lin/Rsrc/blackbox.c b/BlackBox/_Linux_/Lin/Rsrc/blackbox.c index 50dab73..4637982 100644 --- a/BlackBox/_Linux_/Lin/Rsrc/blackbox.c +++ b/BlackBox/_Linux_/Lin/Rsrc/blackbox.c @@ -11,11 +11,13 @@ #include #include #include -#include +/* #include */ +#include +#include /* the exact size (in bytes) of the executable part of the file. */ /* this constant needs to be updated everytime a change is made to this file */ -#define exeSize 16860 +#define exeSize 17028 #define pageSize 4096 @@ -116,6 +118,8 @@ BootInfo* bootInfo; int newRecAdr, newArrAdr; int newRecFP, newArrFP; +int zerofd; + int donothing(char* fmt, ...) { } @@ -355,6 +359,19 @@ int ReadBootHeader() return 1; } +void * MEMALLOC (size_t len) +{ + void * res; + + res = mmap(0, len, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, zerofd, 0); + if (res == MAP_FAILED) { + res = NULL; + } else { + bzero(res, len); + } + return res; +} + int ReadHeader () { int ofTag, i, nofImps, processor; @@ -385,7 +402,7 @@ int ReadHeader () mod.imp = NULL; for (i = 0; i < nofImps; i++) { - imp = (ImpList*)calloc(1, sizeof(ImpList)); + imp = (ImpList*)MEMALLOC(sizeof(ImpList)); ReadName(imp->name); if (mod.imp == NULL) mod.imp = imp; @@ -421,8 +438,8 @@ int ReadModule () int isLib; char* im; - mod.dad = (int) calloc(1, mod.ds); - mod.mad = (int) calloc(1, mod.ms + mod.cs + mod.vs); + mod.dad = (int) MEMALLOC(mod.ds); + mod.mad = (int) MEMALLOC(mod.ms + mod.cs + mod.vs); if ((mod.dad == 0) || (mod.mad == 0)) { printf("BootLoader: Couldn't initalize heap\n"); @@ -570,8 +587,15 @@ int main (int argc, char *argv[]) int callBackAdr; Module *k, *m; + zerofd = open("/dev/zero", O_RDWR); + if (zerofd == -1) { + printf("open /dev/zero failed: %s\n", strerror(errno)); + return 101; + } + modlist = NULL; dprintf("initializing BlackBox for Linux...\n"); + /*f = fopen(bbfile, "rb");*/ f = fopen(argv[0], "r"); if (f != NULL) @@ -604,7 +628,7 @@ int main (int argc, char *argv[]) else { /* assign the boot info to first variable in Kernel */ - bootInfo = calloc(1, sizeof(BootInfo)); + bootInfo = MEMALLOC(sizeof(BootInfo)); bootInfo->modList = modlist; bootInfo->argc = argc; bootInfo->argv = argv; @@ -612,14 +636,16 @@ int main (int argc, char *argv[]) dprintf("before body\n"); body = (BodyProc)(m->code); k->opts = k->opts | init; /* include init in opts */ + /* ok = mprotect( - (void *)(((m->code) / pageSize) * pageSize), - (((m->csize) + MOD(m->code, pageSize) - 1) / pageSize) * pageSize + pageSize, - PROT_READ|PROT_WRITE|PROT_EXEC); + (void *)(((m->code) / pageSize) * pageSize), + (((m->csize) + MOD(m->code, pageSize) - 1) / pageSize) * pageSize + pageSize, + PROT_READ|PROT_WRITE|PROT_EXEC); if (ok != 0){ - printf("mprotect failed!\n"); - return 100; + printf("mprotect failed: %s\n", strerror(errno)); + return 100; } + */ body(); dprintf("after body\n"); } -- 2.29.2