From: Karel Zak Date: Wed, 17 May 2017 10:59:33 +0000 (+0200) Subject: nologin: don't call fstat() after failed open() [coverity scan] X-Git-Tag: v2.30-rc2~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dd732fa25160d2855acb9d4ce46be77d984a73b4;p=thirdparty%2Futil-linux.git nologin: don't call fstat() after failed open() [coverity scan] Signed-off-by: Karel Zak --- diff --git a/login-utils/nologin.c b/login-utils/nologin.c index 2e897cc722..e950d2a3f2 100644 --- a/login-utils/nologin.c +++ b/login-utils/nologin.c @@ -38,7 +38,7 @@ static void __attribute__((__noreturn__)) usage(FILE *out) int main(int argc, char *argv[]) { - int c, fd; + int c, fd = -1; struct stat st; static const struct option longopts[] = { { "help", 0, NULL, 'h' }, @@ -64,16 +64,26 @@ int main(int argc, char *argv[]) } fd = open(_PATH_NOLOGIN_TXT, O_RDONLY); + if (fd < 0) + goto dflt; + c = fstat(fd, &st); - if (fd >= 0 && !c && S_ISREG(st.st_mode)) { + if (c < 0 || !S_ISREG(st.st_mode)) + goto dflt; + else { char buf[BUFSIZ]; ssize_t rd; while ((rd = read(fd, buf, sizeof(buf))) > 0) ignore_result( write(STDOUT_FILENO, buf, rd) ); + close(fd); - } else - fprintf(stdout, _("This account is currently not available.\n")); + return EXIT_FAILURE; + } +dflt: + if (fd >= 0) + close(fd); + fprintf(stdout, _("This account is currently not available.\n")); return EXIT_FAILURE; }