]> git.corax.cc Git - corax/commitdiff
Skip kernel regions in _fork_region() and _vfork_region()
authorMatthias Kruk <m@m10k.eu>
Mon, 18 Nov 2019 11:29:26 +0000 (20:29 +0900)
committerMatthias Kruk <m@m10k.eu>
Mon, 18 Nov 2019 11:29:26 +0000 (20:29 +0900)
kernel/core/process.c

index edc7a86aa3a7e550674d0dfbcb8c614efa15ff65..0d960a677fdc0960bb256e0316b5740f177fa493 100644 (file)
@@ -167,31 +167,33 @@ int _fork_region(pg_dir_t *parent_dir, region_t *reg, void *data)
        ret_val = 0;
        child_dir = (pg_dir_t*)data;
 
-       if(!(reg->reg_flags & REGION_PRIV)) {
-               /* skip regions that are private to the parent */
-
-               switch(reg->reg_type) {
-               case REGION_TEXT:
-               case REGION_RODATA:
-                       /* .text and .rodata are read-only, so we might as well just map them */
-                       ret_val = pg_dir_map_region(child_dir, parent_dir, reg);
-                       break;
-
-               case REGION_BSS:
-               case REGION_DATA:
-                       /* copy the region and its contents */
-                       ret_val = pg_dir_clone_region(child_dir, parent_dir, reg);
-                       break;
+       if(reg->reg_flags & (REGION_PRIV | REGION_KERNEL)) {
+               /* skip private and kernel regions */
+               goto skip;
+       }
 
-               case REGION_KSTACK:
-               case REGION_STACK:
-               case REGION_HEAP:
-                       /* don't clone KSTACK/STACK/HEAP regions */
-               default:
-                       break;
-               }
+       switch(reg->reg_type) {
+       case REGION_TEXT:
+       case REGION_RODATA:
+               /* .text and .rodata are read-only, so we might as well just map them */
+               ret_val = pg_dir_map_region(child_dir, parent_dir, reg);
+               break;
+
+       case REGION_BSS:
+       case REGION_DATA:
+               /* copy the region and its contents */
+               ret_val = pg_dir_clone_region(child_dir, parent_dir, reg);
+               break;
+
+       case REGION_KSTACK:
+       case REGION_STACK:
+       case REGION_HEAP:
+               /* don't clone KSTACK/STACK/HEAP regions */
+       default:
+               break;
        }
 
+skip:
        return(ret_val);
 }
 
@@ -203,27 +205,29 @@ int _vfork_region(pg_dir_t *parent_dir, region_t *reg, void *data)
        ret_val = 0;
        child_dir = (pg_dir_t*)data;
 
-       if(!(reg->reg_flags & REGION_PRIV)) {
-               /* skip private regions */
-
-               switch(reg->reg_type) {
-               case REGION_TEXT:
-               case REGION_BSS:
-               case REGION_DATA:
-               case REGION_RODATA:
-                       /* directly map the region into the new page directory */
-                       ret_val = pg_dir_map_region(child_dir, parent_dir, reg);
-                       break;
+       if(reg->reg_flags & (REGION_PRIV | REGION_KERNEL)) {
+               /* skip private and kernel regions */
+               goto skip;
+       }
 
-               case REGION_KSTACK:
-               case REGION_STACK:
-               case REGION_HEAP:
-                       /* don't map these */
-               default:
-                       break;
-               }
+       switch(reg->reg_type) {
+       case REGION_TEXT:
+       case REGION_BSS:
+       case REGION_DATA:
+       case REGION_RODATA:
+               /* directly map the region into the new page directory */
+               ret_val = pg_dir_map_region(child_dir, parent_dir, reg);
+               break;
+
+       case REGION_KSTACK:
+       case REGION_STACK:
+       case REGION_HEAP:
+               /* don't map these */
+       default:
+               break;
        }
 
+skip:
        return(ret_val);
 }
 
@@ -614,6 +618,8 @@ int process_wait(pid_t pid)
        process_t *cproc;
        int ret_val;
 
+       /* FIXME: Add some sort of event-mask argument to process_wait() */
+
        ret_val = -EFAULT;
        cproc = process_get_current();