mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-21 08:29:41 +00:00
libc: always set argv and envp to valid arrays
The arrays passed to main(…) must always be valid null-terminated arrays. Fix #3955
This commit is contained in:
committed by
Norman Feske
parent
063e4bd072
commit
306466fc60
@ -40,12 +40,20 @@ static void populate_args_and_env(Libc::Env &env, int &argc, char **&argv, char
|
|||||||
++envc;
|
++envc;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (argc == 0 && envc == 0)
|
if (argc == 0 && envc == 0) {
|
||||||
|
/*
|
||||||
|
* If argc is zero then argv is still a NULL-terminated array.
|
||||||
|
*/
|
||||||
|
static char const *args[] = { nullptr, nullptr };
|
||||||
|
argc = 0;
|
||||||
|
argv = (char**)&args;
|
||||||
|
envp = &argv[1];
|
||||||
return; /* from lambda */
|
return; /* from lambda */
|
||||||
|
}
|
||||||
|
|
||||||
/* arguments and environment are a contiguous array (but don't count on it) */
|
/* arguments and environment are arranged System V style (but don't count on it) */
|
||||||
argv = (char**)malloc((argc + envc + 1) * sizeof(char*));
|
argv = (char**)malloc((argc + envc + 2) * sizeof(char*));
|
||||||
envp = &argv[argc];
|
envp = &argv[argc+1];
|
||||||
|
|
||||||
/* read the arguments */
|
/* read the arguments */
|
||||||
int arg_i = 0;
|
int arg_i = 0;
|
||||||
@ -123,6 +131,8 @@ static void populate_args_and_env(Libc::Env &env, int &argc, char **&argv, char
|
|||||||
catch (Xml_node::Nonexistent_attribute) { }
|
catch (Xml_node::Nonexistent_attribute) { }
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/* argv and envp are both NULL terminated */
|
||||||
|
argv[arg_i] = NULL;
|
||||||
envp[env_i] = NULL;
|
envp[env_i] = NULL;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user