From 439cdf1e2475d2f6622c151419f90c7da6de1434 Mon Sep 17 00:00:00 2001 From: Sami Kerola Date: Wed, 4 Apr 2012 19:58:34 +0200 Subject: [PATCH] login-utils: verify writing to streams was successful Signed-off-by: Sami Kerola --- login-utils/chfn.c | 2 ++ login-utils/chsh.c | 2 ++ login-utils/islocal.c | 2 ++ login-utils/last.c | 2 ++ login-utils/logindefs.c | 2 ++ login-utils/newgrp.c | 2 ++ login-utils/setpwnam.c | 6 ++---- login-utils/sulogin.c | 2 ++ login-utils/vipw.c | 6 ++++-- 9 files changed, 20 insertions(+), 6 deletions(-) diff --git a/login-utils/chfn.c b/login-utils/chfn.c index 2d9a092cb..02014c7ce 100644 --- a/login-utils/chfn.c +++ b/login-utils/chfn.c @@ -33,6 +33,7 @@ #include "c.h" #include "env.h" +#include "closestream.h" #include "islocal.h" #include "nls.h" #include "pamfail.h" @@ -96,6 +97,7 @@ int main(int argc, char **argv) setlocale(LC_ALL, ""); /* both for messages and for iscntrl() below */ bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); + atexit(close_stdout); /* * "oldf" contains the users original finger information. diff --git a/login-utils/chsh.c b/login-utils/chsh.c index 4f0615c08..7d944e19f 100644 --- a/login-utils/chsh.c +++ b/login-utils/chsh.c @@ -34,6 +34,7 @@ #include "c.h" #include "env.h" +#include "closestream.h" #include "islocal.h" #include "nls.h" #include "pamfail.h" @@ -82,6 +83,7 @@ int main(int argc, char **argv) setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); + atexit(close_stdout); uid = getuid(); memset(&info, 0, sizeof(info)); diff --git a/login-utils/islocal.c b/login-utils/islocal.c index 91dda0d29..e23ca44e0 100644 --- a/login-utils/islocal.c +++ b/login-utils/islocal.c @@ -22,6 +22,7 @@ #include #include +#include "closestream.h" #include "islocal.h" #include "nls.h" #include "pathnames.h" @@ -94,6 +95,7 @@ int is_local(const char *user) #ifdef TEST_PROGRAM int main(int argc, char *argv[]) { + atexit(close_stdout); if (argc <= 2) { fprintf(stderr, "usage: %s [...]\n", argv[0]); diff --git a/login-utils/last.c b/login-utils/last.c index 417314ee5..34558bb9d 100644 --- a/login-utils/last.c +++ b/login-utils/last.c @@ -56,6 +56,7 @@ #include #include +#include "closestream.h" #include "pathnames.h" #include "nls.h" #include "xalloc.h" @@ -121,6 +122,7 @@ main(int argc, char **argv) { setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); + atexit(close_stdout); while ((ch = getopt(argc, argv, "0123456789yli:f:h:t:")) != -1) switch((char)ch) { diff --git a/login-utils/logindefs.c b/login-utils/logindefs.c index 7b801cf70..ff7266ea1 100644 --- a/login-utils/logindefs.c +++ b/login-utils/logindefs.c @@ -29,6 +29,7 @@ #include #include "c.h" +#include "closestream.h" #include "logindefs.h" #include "nls.h" #include "pathnames.h" @@ -252,6 +253,7 @@ int logindefs_setenv(const char *name, const char *conf, const char *dflt) int main(int argc, char *argv[]) { char *name, *type; + atexit(close_stdout); if (argc <= 1) errx(EXIT_FAILURE, "usage: %s " diff --git a/login-utils/newgrp.c b/login-utils/newgrp.c index 707c5893a..4f6de12a1 100644 --- a/login-utils/newgrp.c +++ b/login-utils/newgrp.c @@ -29,6 +29,7 @@ #endif #include "c.h" +#include "closestream.h" #include "nls.h" #include "pathnames.h" @@ -132,6 +133,7 @@ int main(int argc, char *argv[]) setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); + atexit(close_stdout); while ((ch = getopt_long(argc, argv, "Vh", longopts, NULL)) != -1) switch (ch) { diff --git a/login-utils/setpwnam.c b/login-utils/setpwnam.c index 7459fe298..ba15bc131 100644 --- a/login-utils/setpwnam.c +++ b/login-utils/setpwnam.c @@ -59,7 +59,7 @@ #include #include "c.h" -#include "fileutils.h" +#include "closestream.h" #include "setpwnam.h" static void pw_init(void); @@ -143,9 +143,7 @@ int setpwnam(struct passwd *pwd) /* xfmkstemp is too restrictive by default for passwd file */ if (fchmod(fileno(fp), 0644) < 0) goto fail; - rc = fclose(fp); - fp = NULL; - if (rc < 0) + if (close_stream(fp) != 0) goto fail; fclose(pwf); /* I don't think I want to know if this failed */ diff --git a/login-utils/sulogin.c b/login-utils/sulogin.c index 616442ee4..ee725b588 100644 --- a/login-utils/sulogin.c +++ b/login-utils/sulogin.c @@ -47,6 +47,7 @@ #endif #include "c.h" +#include "closestream.h" #include "nls.h" #include "pathnames.h" #include "strutils.h" @@ -476,6 +477,7 @@ int main(int argc, char **argv) setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); + atexit(close_stdout); /* * See if we have a timeout flag. diff --git a/login-utils/vipw.c b/login-utils/vipw.c index 29e485cc4..2d16999d2 100644 --- a/login-utils/vipw.c +++ b/login-utils/vipw.c @@ -72,7 +72,7 @@ #include #include "c.h" -#include "fileutils.h" +#include "closestream.h" #include "nls.h" #include "setpwnam.h" #include "strutils.h" @@ -283,7 +283,8 @@ static void edit_file(int is_shadow) ch_ret = fchmod(fileno(tmp_fd), 0400); if (ch_ret < 0) err(EXIT_FAILURE, "%s: %s", _("cannot chmod file"), orig_file); - fclose(tmp_fd); + if (close_stream(tmp_fd) != 0) + err(EXIT_FAILURE, _("write error")); pw_write(); close(passwd_file); ulckpwdf(); @@ -294,6 +295,7 @@ int main(int argc, char *argv[]) setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); + atexit(close_stdout); if (!strcmp(program_invocation_short_name, "vigr")) { program = VIGR;