@@ -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