]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
util-lib: use a fixed buffer size for terminal path
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 20 Mar 2019 08:33:27 +0000 (09:33 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 20 Mar 2019 08:36:45 +0000 (09:36 +0100)
The loop around ttyname_r() makes it look like we use unbounded stack
allocations. We know that that paths have a maximum size, so let's simplify
the whole thing.

Replaces #12043.

src/basic/terminal-util.c

index 4702e917324a80fc26b1c3beeffdd82855e4e7ce..ab8917ccc5c7b093660afdc6c308fbe0cd50d182 100644 (file)
@@ -891,33 +891,24 @@ bool on_tty(void) {
 }
 
 int getttyname_malloc(int fd, char **ret) {
-        size_t l = 100;
+        char path[PATH_MAX], *c; /* PATH_MAX is counted *with* the trailing NUL byte */
         int r;
 
         assert(fd >= 0);
         assert(ret);
 
-        for (;;) {
-                char path[l];
-
-                r = ttyname_r(fd, path, sizeof(path));
-                if (r == 0) {
-                        char *c;
+        r = ttyname_r(fd, path, sizeof path); /* positive error */
+        assert(r >= 0);
+        if (r == ERANGE)
+                return -ENAMETOOLONG;
+        if (r > 0)
+                return -r;
 
-                        c = strdup(skip_dev_prefix(path));
-                        if (!c)
-                                return -ENOMEM;
-
-                        *ret = c;
-                        return 0;
-                }
-
-                if (r != ERANGE)
-                        return -r;
-
-                l *= 2;
-        }
+        c = strdup(skip_dev_prefix(path));
+        if (!c)
+                return -ENOMEM;
 
+        *ret = c;
         return 0;
 }