]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/blobdiff - src/trackfds.h
trackfds.h: Handle overflow in update_environment().
[coloredstderr/coloredstderr.git] / src / trackfds.h
index 474b072d2026d9eee0faeb4505529f2d06a2fa9f..b26059da533d8119e96551f80acac5bdf3101df0 100644 (file)
@@ -34,9 +34,19 @@ static size_t tracked_fds_space;
  * ENV_NAME_FDS has the following format: Each descriptor as string followed
  * by a comma; there's a trailing comma. Example: "2,4,". */
 static void init_from_environment(void) {
+    const char *env;
+
+    initialized = 1;
     tracked_fds_count = 0;
 
-    const char *env = getenv(ENV_NAME_FDS);
+    /* If ENV_NAME_FORCE_WRITE is set and not empty, allow writes to a non-tty
+     * device. Use with care! Mainly used for the test suite. */
+    env = getenv(ENV_NAME_FORCE_WRITE);
+    if (env && env[0] != '\0') {
+        force_write_to_non_tty = 1;
+    }
+
+    env = getenv(ENV_NAME_FDS);
     if (!env) {
         return;
     }
@@ -95,15 +105,17 @@ static void init_from_environment(void) {
 static void update_environment(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
-     * truncated. */
+     * skipped. */
     char env[tracked_fds_count * (10 + 1) * sizeof(char)];
     char *x = env;
 
     size_t i;
     for (i = 0; i < tracked_fds_count; i++) {
         int length = snprintf(x, 10 + 1, "%d", tracked_fds[i]);
-        if (length >= 10 + 1)
-            return;
+        if (length >= 10 + 1) {
+            /* Integer too bit to fit the buffer, skip it. */
+            continue;
+        }
 
         /* Write comma after number. */
         x += length;