]> andersk Git - openssh.git/blobdiff - session.c
- (tim) [configure.ac] Due to constraints in Windows Sockets in terms of
[openssh.git] / session.c
index cc205386f3d1b597ac9630529caa0132f477cd02..fd7acbe03bb1751b89748da23b2d342bd6925c1a 100644 (file)
--- a/session.c
+++ b/session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.c,v 1.248 2009/11/19 23:39:50 djm Exp $ */
+/* $OpenBSD: session.c,v 1.251 2010/01/12 08:33:17 dtucker Exp $ */
 /*
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
  *                    All rights reserved
@@ -1377,26 +1377,32 @@ static void
 do_nologin(struct passwd *pw)
 {
        FILE *f = NULL;
-       char buf[1024];
+       char buf[1024], *nl, *def_nl = _PATH_NOLOGIN;
+       struct stat sb;
 
 #ifdef HAVE_LOGIN_CAP
-       if (!login_getcapbool(lc, "ignorenologin", 0) && pw->pw_uid)
-               f = fopen(login_getcapstr(lc, "nologin", _PATH_NOLOGIN,
-                   _PATH_NOLOGIN), "r");
+       if (login_getcapbool(lc, "ignorenologin", 0) && pw->pw_uid)
+               return;
+       nl = login_getcapstr(lc, "nologin", def_nl, def_nl);
 #else
-       if (pw->pw_uid)
-               f = fopen(_PATH_NOLOGIN, "r");
+       if (pw->pw_uid == 0)
+               return;
+       nl = def_nl;
 #endif
-       if (f) {
-               /* /etc/nologin exists.  Print its contents and exit. */
-               logit("User %.100s not allowed because %s exists",
-                   pw->pw_name, _PATH_NOLOGIN);
-               while (fgets(buf, sizeof(buf), f))
-                       fputs(buf, stderr);
-               fclose(f);
-               fflush(NULL);
-               exit(254);
+       if (stat(nl, &sb) == -1) {
+               if (nl != def_nl)
+                       xfree(nl);
+               return;
        }
+
+       /* /etc/nologin exists.  Print its contents if we can and exit. */
+       logit("User %.100s not allowed because %s exists", pw->pw_name, nl);
+       if ((f = fopen(nl, "r")) != NULL) {
+               while (fgets(buf, sizeof(buf), f))
+                       fputs(buf, stderr);
+               fclose(f);
+       }
+       exit(254);
 }
 
 /*
@@ -2121,16 +2127,16 @@ session_subsystem_req(Session *s)
                if (strcmp(subsys, options.subsystem_name[i]) == 0) {
                        prog = options.subsystem_command[i];
                        cmd = options.subsystem_args[i];
-                       if (!strcmp(INTERNAL_SFTP_NAME, prog)) {
+                       if (strcmp(INTERNAL_SFTP_NAME, prog) == 0) {
                                s->is_subsystem = SUBSYSTEM_INT_SFTP;
-                       } else if (stat(prog, &st) < 0) {
-                               error("subsystem: cannot stat %s: %s", prog,
-                                   strerror(errno));
-                               break;
+                               debug("subsystem: %s", prog);
                        } else {
+                               if (stat(prog, &st) < 0)
+                                       debug("subsystem: cannot stat %s: %s",
+                                           prog, strerror(errno));
                                s->is_subsystem = SUBSYSTEM_EXT;
+                               debug("subsystem: exec() %s", cmd);
                        }
-                       debug("subsystem: exec() %s", cmd);
                        success = do_exec(s, cmd) == 0;
                        break;
                }
This page took 0.090003 seconds and 4 git commands to generate.