Skip to content

Commit 41d17e1

Browse files
committed
add missing fix on process
1 parent 493ca91 commit 41d17e1

1 file changed

Lines changed: 8 additions & 5 deletions

File tree

so3/kernel/process.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ addr_t preserve_args_and_env(int argc, char **argv, char **envp)
446446
/* Save env strings and count how many there are */
447447
saved->envc = 0;
448448
if (envp) {
449-
do {
449+
while (envp[saved->envc]) {
450450
str_len = strlen(envp[saved->envc]) + 1;
451451

452452
/* Ensure the newly copied string will not exceed the buffer size. */
@@ -459,7 +459,9 @@ addr_t preserve_args_and_env(int argc, char **argv, char **envp)
459459

460460
strcpy(&saved->arg_env[saved->strings_size], envp[saved->envc]);
461461
saved->strings_size += str_len;
462-
} while (envp[saved->envc++]);
462+
463+
saved->envc++;
464+
}
463465
}
464466

465467
return (addr_t) saved;
@@ -477,11 +479,12 @@ void post_setup_image(args_env_t *args_env, elf_img_info_t *elf_img_info)
477479
args_base = (char *) arch_get_args_base();
478480

479481
/* Save argc as first arguments */
480-
*((int *) args_base) = args_env->argc;
482+
*((long *) args_base) = args_env->argc;
481483

482484
/* Get the base address for the array of pointer for args, env and aux */
483-
argv_p_base = (char **) (args_base + sizeof(int));
484-
env_p_base = (char **) ((addr_t) argv_p_base + args_env->argc * sizeof(char *));
485+
argv_p_base = (char **) (args_base + sizeof(long));
486+
/* Add one to account for the null termination of env */
487+
env_p_base = (char **) ((addr_t) argv_p_base + (args_env->argc + 1) * sizeof(char *));
485488
/* Add one to account for the null termination of env */
486489
aux_elf = (elf_addr_t *) ((addr_t) env_p_base + (args_env->envc + 1) * sizeof(char *));
487490

0 commit comments

Comments
 (0)