Handle cleanup properly in ttytostr() - ubase - suckless linux base utils | |
git clone git://git.suckless.org/ubase | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit a7a561ef008ea0842b54713434d5f3fd79e8ccec | |
parent 8a95422ff14aed8c8cd7cfad51913db90493a50c | |
Author: sin <[email protected]> | |
Date: Fri, 16 Jan 2015 16:06:42 +0000 | |
Handle cleanup properly in ttytostr() | |
Diffstat: | |
M libutil/tty.c | 20 ++++++++++++++------ | |
1 file changed, 14 insertions(+), 6 deletions(-) | |
--- | |
diff --git 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; | |
} |