DEADSOFTWARE

more crossplatform memory protaction used (mmap), fix by: Alexander Shiryaev
authorIvan Denisov <d.ivan.krsk@gmail.com>
Sat, 3 Oct 2015 18:26:32 +0000 (01:26 +0700)
committerIvan Denisov <d.ivan.krsk@gmail.com>
Sat, 3 Oct 2015 18:26:32 +0000 (01:26 +0700)
BlackBox/_Linux_/Lin/Rsrc/blackbox.c

index 50dab7321053814bd9b0aada642cf4cec58c964c..4637982a894c559e4b9713b97b84f7a86f4b872e 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <malloc.h>
+/* #include <malloc.h> */
+#include <errno.h>
+#include <fcntl.h>
 
 /* 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");
                  }