From 30222f4b2c90dae73c012c1733b3ba46b9afd7a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 20 Mar 2019 09:33:27 +0100 Subject: [PATCH] util-lib: use a fixed buffer size for terminal path 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 | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 4702e91732..ab8917ccc5 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -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); /* positive error */ + assert(r >= 0); + if (r == ERANGE) + return -ENAMETOOLONG; + if (r > 0) + return -r; - r = ttyname_r(fd, path, sizeof(path)); - if (r == 0) { - char *c; - - 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; }