X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=src%2Ftrackfds.h;h=f0ba8791d8485fd5441ae7bcd45109bdda482560;hb=ba2283bd3780a13f26521c5c47deedfc7184ed7d;hp=b9089bbd25b0444772c6442ca27dedd3ac7e4334;hpb=6d6ad4423ae87771bd44f90006a648ec03931961;p=coloredstderr%2Fcoloredstderr.git diff --git a/src/trackfds.h b/src/trackfds.h index b9089bb..f0ba879 100644 --- a/src/trackfds.h +++ b/src/trackfds.h @@ -100,7 +100,7 @@ static void init_from_environment(void) { #ifdef DEBUG debug(" getenv(\"%s\"): \"%s\"\n", ENV_NAME_FDS, env); #endif - /* Environment is read-only. */ + /* Environment must be treated read-only. */ char env_copy[strlen(env) + 1]; strcpy(env_copy, env); @@ -124,18 +124,21 @@ static void init_from_environment(void) { } /* ',' at the beginning or double ',' - ignore. */ if (x == last) { - last = x + 1; - continue; + goto next; } if (i == count) { break; } + /* Replace ',' to null-terminate number for atoi(). */ *x = 0; int fd = atoi(last); - if (fd < TRACKFDS_STATIC_COUNT) { + if (fd < 0) { + goto next; + + } else if (fd < TRACKFDS_STATIC_COUNT) { tracked_fds[fd] = 1; } else { if (!tracked_fds_list) { @@ -169,7 +172,7 @@ static char *update_environment_buffer_entry(char *x, int fd) { assert(fd >= 0); int length = snprintf(x, 10 + 1, "%d", fd); - if (length >= 10 + 1) { + if (length >= 10 + 1 || length <= 0 /* shouldn't happen */) { /* Integer too big to fit the buffer, skip it. */ #ifdef WARNING warning("update_environment_buffer_entry(): truncated fd: %d [%d]\n", @@ -181,7 +184,7 @@ static char *update_environment_buffer_entry(char *x, int fd) { /* Write comma after number. */ x += length; *x++ = ','; - /* Make sure the string is always zero terminated. */ + /* Make sure the string is always null-terminated. */ *x = 0; return x; @@ -325,8 +328,12 @@ static int tracked_fds_find_slow(int fd) noinline; * they are not called often enough. */ inline static int tracked_fds_find(int fd) always_inline; -static int tracked_fds_find(int fd) { - assert(fd >= 0); +inline static int tracked_fds_find(int fd) { + /* Invalid file descriptor. No assert() as we're called from the hooked + * macro. */ + if (unlikely(fd < 0)) { + return 0; + } if (fd < TRACKFDS_STATIC_COUNT) { return tracked_fds[fd]; @@ -336,6 +343,7 @@ static int tracked_fds_find(int fd) { } static int tracked_fds_find_slow(int fd) { assert(initialized); + assert(fd >= 0); if (tracked_fds_list_count == 0) { return 0;