From: Matthias Kruk Date: Mon, 18 Nov 2019 11:29:26 +0000 (+0900) Subject: Skip kernel regions in _fork_region() and _vfork_region() X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=b78b488877ef86b151a448acc634f4e9cd9aeead;p=corax Skip kernel regions in _fork_region() and _vfork_region() --- diff --git a/kernel/core/process.c b/kernel/core/process.c index edc7a86..0d960a6 100644 --- a/kernel/core/process.c +++ b/kernel/core/process.c @@ -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();