mirror of
https://github.com/FAUSheppy/colorredstderr-mirror
synced 2025-12-12 18:08:31 +01:00
Hook execve() and the other exec*() functions.
Prevents programs from removing our environment variables during the exec. Also reduces unnecessary calls to update_environment() by calling it only once before the exec.
This commit is contained in:
@@ -121,19 +121,7 @@ static void init_from_environment(void) {
|
||||
#endif
|
||||
}
|
||||
|
||||
static void update_environment(void) {
|
||||
#ifdef DEBUG
|
||||
debug("update_environment()\t\t[%d]\n", getpid());
|
||||
#endif
|
||||
|
||||
/* An integer (32-bit) has at most 10 digits, + 1 for the comma after each
|
||||
* number. Bigger file descriptors (which shouldn't occur in reality) are
|
||||
* skipped. */
|
||||
char env[tracked_fds_count * (10 + 1) + 1 /* to fit '\0' */ ];
|
||||
env[0] = 0;
|
||||
|
||||
char *x = env;
|
||||
|
||||
static void update_environment_buffer(char *x) {
|
||||
size_t i;
|
||||
for (i = 0; i < tracked_fds_count; i++) {
|
||||
int length = snprintf(x, 10 + 1, "%d", tracked_fds[i]);
|
||||
@@ -148,6 +136,28 @@ static void update_environment(void) {
|
||||
/* Make sure the string is always zero terminated. */
|
||||
*x = 0;
|
||||
}
|
||||
}
|
||||
inline static size_t update_environment_buffer_size(void) {
|
||||
/* An integer (32-bit) has at most 10 digits, + 1 for the comma after each
|
||||
* number. Bigger file descriptors (which shouldn't occur in reality) are
|
||||
* skipped. */
|
||||
return tracked_fds_count * (10 + 1) + 1 /* to fit '\0' */;
|
||||
}
|
||||
static void update_environment(void) {
|
||||
#ifdef DEBUG
|
||||
debug("update_environment()\t\t[%d]\n", getpid());
|
||||
#endif
|
||||
|
||||
/* If we haven't parsed the environment we also haven't modified it - so
|
||||
* nothing to do. */
|
||||
if (!initialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
char env[update_environment_buffer_size()];
|
||||
env[0] = 0;
|
||||
|
||||
update_environment_buffer(env);
|
||||
|
||||
#if 0
|
||||
debug(" setenv('%s', '%s', 1)\n", ENV_NAME_FDS, env);
|
||||
|
||||
Reference in New Issue
Block a user