From: Sergiu Moga Date: Tue, 15 Aug 2023 07:32:34 +0000 (+0300) Subject: lib/posix-environ: Ensure that compiled-in strings are writable X-Git-Tag: RELEASE-0.14.0~19 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=ad856986c86b3b4fdf78be76582530c96ec47cb1;p=unikraft%2Funikraft.git lib/posix-environ: Ensure that compiled-in strings are writable Previously, the elements of `__init_env` would be compile-in strings that would correspond to `CONFIG_LIBPOSIX_ENVIRON_ENVPx` configurable strings. This lead to these strings being placed by in the `.rodata` section and making them unmodifiable. Unfortunately, Redis represents an application whose code may want to modify such data (see commit 6356cf6808be ("Set process name in ps output to make operations safer.")). Therefore, to appease such actions, make sure that this data is placed in a modifiable section such as `.data` by using statically declared global variables containing these very strings as an indirection. To make it look somewhat nicer, do so with the help of two basic helper macros: DECLARE_LIBPOSIX_ENVIRON_ENV_VAR to transparently declare such variables and LIBPOSIX_ENVIRON_ENV_VAR to transparently access them. Signed-off-by: Sergiu Moga Reviewed-by: Michalis Pappas Approved-by: Simon Kuenzer Tested-by: Unikraft CI GitHub-Closes: #1054 --- diff --git a/lib/posix-environ/environ.c b/lib/posix-environ/environ.c index e7920ef4f..fa6958b69 100644 --- a/lib/posix-environ/environ.c +++ b/lib/posix-environ/environ.c @@ -7,6 +7,30 @@ #include #include "environ.h" +#define LIBPOSIX_ENVIRON_ENV_VAR(x) e##x + +#define DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(x) \ + static char LIBPOSIX_ENVIRON_ENV_VAR(x)[] = \ + CONFIG_LIBPOSIX_ENVIRON_ENVP##x + + +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(0); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(1); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(2); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(3); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(4); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(5); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(6); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(7); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(8); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(9); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(10); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(11); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(12); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(13); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(14); +DECLARE_LIBPOSIX_ENVIRON_ENV_VAR(15); + /* * Size the array */ @@ -64,52 +88,52 @@ static char *__init_env[1 /* null termination */ #endif /* CONFIG_LIBPOSIX_ENVIRON_LIBPARAM */ ] = { #if CONFIG_LIBPOSIX_ENVIRON_ENVP0_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP0, + LIBPOSIX_ENVIRON_ENV_VAR(0), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP0_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP1_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP1, + LIBPOSIX_ENVIRON_ENV_VAR(1), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP1_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP2_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP2, + LIBPOSIX_ENVIRON_ENV_VAR(2), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP2_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP3_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP3, + LIBPOSIX_ENVIRON_ENV_VAR(3), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP3_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP4_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP4, + LIBPOSIX_ENVIRON_ENV_VAR(4), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP4_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP5_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP5, + LIBPOSIX_ENVIRON_ENV_VAR(5), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP5_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP6_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP6, + LIBPOSIX_ENVIRON_ENV_VAR(6), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP6_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP7_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP7, + LIBPOSIX_ENVIRON_ENV_VAR(7), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP7_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP8_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP8, + LIBPOSIX_ENVIRON_ENV_VAR(8), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP8_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP9_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP9, + LIBPOSIX_ENVIRON_ENV_VAR(9), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP9_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP10_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP10, + LIBPOSIX_ENVIRON_ENV_VAR(10), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP10_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP11_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP11, + LIBPOSIX_ENVIRON_ENV_VAR(11), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP11_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP12_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP12, + LIBPOSIX_ENVIRON_ENV_VAR(12), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP12_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP13_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP13, + LIBPOSIX_ENVIRON_ENV_VAR(13), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP13_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP14_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP14, + LIBPOSIX_ENVIRON_ENV_VAR(14), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP14_NOTEMPTY */ #if CONFIG_LIBPOSIX_ENVIRON_ENVP15_NOTEMPTY - CONFIG_LIBPOSIX_ENVIRON_ENVP15, + LIBPOSIX_ENVIRON_ENV_VAR(15), #endif /* CONFIG_LIBPOSIX_ENVIRON_ENVP15_NOTEMPTY */ NULL /* termination */ };