Kernel - Fixed buggy module loader logic, allowed ELF relocations to RO pages
authorJohn Hodge <[email protected]>
Mon, 16 Sep 2013 05:13:41 +0000 (13:13 +0800)
committerJohn Hodge <[email protected]>
Mon, 16 Sep 2013 05:13:41 +0000 (13:13 +0800)
KernelLand/Kernel/bin/elf.c
KernelLand/Kernel/modules.c

index f4c73e2..d404d6d 100644 (file)
@@ -29,7 +29,18 @@ static int   GetSymbol(const char *Name, void **Value, size_t *Size) {
 }\r
 #define AddLoaded(a,b) do{}while(0)\r
 #define LoadLibrary(a,b,c)     (Log_Debug("ELF", "Module requested lib '%s'",a),0)\r
-#define _SysSetMemFlags(ad,f,m)        do{}while(0)\r
+static int     _SysSetMemFlags(tVAddr addr, int flag, int mask) {\r
+       if( mask & 1 ) {\r
+               if( flag ) {\r
+                       // Re-set RO, clear COW\r
+                       MM_SetFlags(addr, MM_PFLAG_RO, MM_PFLAG_RO|MM_PFLAG_COW);\r
+               }\r
+               else {\r
+                       MM_SetFlags(addr, MM_PFLAG_RO|MM_PFLAG_COW, MM_PFLAG_RO|MM_PFLAG_COW);\r
+               }\r
+       }\r
+       return 0;\r
+}\r
 #include "../../../Usermode/Libraries/ld-acess.so_src/elf.c"\r
 // ---- / ----\r
 \r
index c5e7f1b..b5e917c 100644 (file)
@@ -341,7 +341,7 @@ int Module_LoadMem(void *Buffer, Uint Length, const char *ArgString)
        
        VFS_GetMemPath(path, Buffer, Length);
        
-       return Module_LoadFile( path, ArgString );
+       return Module_LoadFile( path, ArgString ) == EOK;
 }
 
 /**
@@ -360,7 +360,7 @@ int Module_LoadFile(const char *Path, const char *ArgString)
        // Error check
        if(base == NULL) {
                Log_Warning("Module", "Module_LoadFile - Unable to load '%s'", Path);
-               return 0;
+               return ENOENT;
        }
 
        // TODO: I need a way of relocating the dependencies before everything else, so
@@ -368,7 +368,7 @@ int Module_LoadFile(const char *Path, const char *ArgString)
        if( !Binary_Relocate(base) ) {
                Log_Warning("Module", "Relocation of module %s failed", Path);
                Binary_Unload(base);
-               return 0;
+               return EINVAL;
        }
        
        // Check for Acess Driver
@@ -384,24 +384,34 @@ int Module_LoadFile(const char *Path, const char *ArgString)
                if( !loader ) {
                        Binary_Unload(base);
                        Log_Warning("Module", "Module '%s' does not have a Module Info struct", Path);
-                       return 0;
+                       return EINVAL;
                }
        }
 
-       if( !Module_int_ResolveDeps(info) ) {
-               Log_Warning("Module", "Dependencies not met for '%s'", Path);
-               Binary_Unload(base);
-               return 0;
+       if( loader )
+       {
+               if( loader->Loader(base) )
+               {
+                       Binary_Unload(base);
+                       return EINVAL;
+               }
        }
-
-       // Initialise (and register)
-       if( loader ? loader->Loader(base) : Module_int_Initialise( info, ArgString ) )
+       else
        {
-               Binary_Unload(base);
-               return 0;
+               if( !Module_int_ResolveDeps(info) ) {
+                       Log_Warning("Module", "Dependencies not met for '%s'", Path);
+                       Binary_Unload(base);
+                       return EINVAL;
+               }
+               
+               if( Module_int_Initialise(info, ArgString) )
+               {
+                       Binary_Unload(base);
+                       return EINVAL;
+               }
        }
        
-       return 1;
+       return 0;
 }
 
 /**

UCC git Repository :: git.ucc.asn.au