X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=src%2Ftrackfds.h;h=70751d760c68bb6ee3ad2fe924348f1ee6d3ee52;hb=3c2b4bf9f65fcf6f631d7529a3391c3564b3dc29;hp=1eede800ddcd745f7e8eb1a4595157260bf74131;hpb=357a499884543ec285238c9ec6c53565fa4d5b48;p=coloredstderr%2Fcoloredstderr.git diff --git a/src/trackfds.h b/src/trackfds.h index 1eede80..70751d7 100644 --- a/src/trackfds.h +++ b/src/trackfds.h @@ -51,6 +51,8 @@ static void tracked_fds_debug(void) { #endif static int init_tracked_fds_list(size_t count) { + assert(count > 0); + /* Reduce reallocs. */ count += TRACKFDS_REALLOC_STEP; @@ -95,6 +97,9 @@ static void init_from_environment(void) { errno = saved_errno; return; } +#ifdef DEBUG + debug(" getenv(\"%s\"): \"%s\"\n", ENV_NAME_FDS, env); +#endif /* Environment is read-only. */ char env_copy[strlen(env) + 1]; strcpy(env_copy, env); @@ -130,7 +135,10 @@ static void init_from_environment(void) { *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) { @@ -161,8 +169,10 @@ next: } 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", @@ -180,6 +190,8 @@ static char *update_environment_buffer_entry(char *x, int fd) { return x; } static void update_environment_buffer(char *x) { + assert(initialized); + size_t i; for (i = 0; i < TRACKFDS_STATIC_COUNT; i++) { if (tracked_fds[i]) { @@ -191,6 +203,8 @@ static void update_environment_buffer(char *x) { } } inline static size_t update_environment_buffer_size(void) { + assert(initialized); + /* Use the maximum count (TRACKFDS_STATIC_COUNT) of used descriptors * because it's simple and small enough not to be a problem. * @@ -217,7 +231,7 @@ static void update_environment(void) { update_environment_buffer(env); #if 0 - debug(" setenv('%s', '%s', 1)\n", ENV_NAME_FDS, env); + debug(" setenv(\"%s\", \"%s\", 1)\n", ENV_NAME_FDS, env); #endif setenv(ENV_NAME_FDS, env, 1 /* overwrite */); @@ -226,6 +240,8 @@ static void update_environment(void) { static void tracked_fds_add(int fd) { + assert(fd >= 0); + if (fd < TRACKFDS_STATIC_COUNT) { tracked_fds[fd] = 1; #if 0 @@ -266,6 +282,8 @@ static void tracked_fds_add(int fd) { #endif } static int tracked_fds_remove(int fd) { + assert(fd >= 0); + if (fd < TRACKFDS_STATIC_COUNT) { int old_value = tracked_fds[fd]; tracked_fds[fd] = 0; @@ -310,7 +328,9 @@ 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) { +inline static int tracked_fds_find(int fd) { + assert(fd >= 0); + if (fd < TRACKFDS_STATIC_COUNT) { return tracked_fds[fd]; } @@ -318,6 +338,8 @@ static int tracked_fds_find(int fd) { return tracked_fds_find_slow(fd); } static int tracked_fds_find_slow(int fd) { + assert(initialized); + if (tracked_fds_list_count == 0) { return 0; }