]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
lib/posix-environ: Ensure that compiled-in strings are writable
authorSergiu Moga <sergiu@unikraft.io>
Tue, 15 Aug 2023 07:32:34 +0000 (10:32 +0300)
committerUnikraft <monkey@unikraft.io>
Tue, 15 Aug 2023 19:15:20 +0000 (19:15 +0000)
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 <sergiu@unikraft.io>
Reviewed-by: Michalis Pappas <michalis@unikraft.io>
Approved-by: Simon Kuenzer <simon@unikraft.io>
Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #1054

lib/posix-environ/environ.c

index e7920ef4ffadc3f4bd2523e602a0c092997fba2f..fa6958b693aef777f03f6dca5c201ec81127e7b9 100644 (file)
@@ -7,6 +7,30 @@
 #include <uk/essentials.h>
 #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 */
 };