From a7a561ef008ea0842b54713434d5f3fd79e8ccec Mon Sep 17 00:00:00 2001 From: sin Date: Fri, 16 Jan 2015 16:06:42 +0000 Subject: [PATCH] Handle cleanup properly in ttytostr() --- libutil/tty.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/libutil/tty.c b/libutil/tty.c index f8159d9..0197f7e 100644 --- a/libutil/tty.c +++ b/libutil/tty.c @@ -27,6 +27,7 @@ ttytostr(int tty_maj, int tty_min, char *str, size_t n) DIR *dirp; char path[PATH_MAX]; int fd; + int r = 0; switch (tty_maj) { case 136: @@ -54,16 +55,19 @@ ttytostr(int tty_maj, int tty_min, char *str, size_t n) if (strlcpy(path, "/dev/", sizeof(path)) >= sizeof(path)) { weprintf("path too long\n"); - return -1; + r = -1; + goto err0; } if (strlcat(path, dp->d_name, sizeof(path)) >= sizeof(path)) { weprintf("path too long\n"); - return -1; + r = -1; + goto err0; } if (stat(path, &sb) < 0) { weprintf("stat %s:", path); - return -1; + r = -1; + goto err0; } if ((int)major(sb.st_rdev) == tty_maj && @@ -75,15 +79,19 @@ ttytostr(int tty_maj, int tty_min, char *str, size_t n) strlcpy(str, dp->d_name, n); close(fd); break; + } else { + close(fd); + r = -1; + goto err0; } - close(fd); } } +err0: if (closedir(dirp) < 0) { weprintf("closedir /dev:"); - return -1; + r = -1; } - return 0; + return r; }