svn commit: trunk/busybox: libbb loginutils shell

vda at busybox.net vda at busybox.net
Mon Dec 18 16:20:22 PST 2006


Author: vda
Date: 2006-12-18 16:20:20 -0800 (Mon, 18 Dec 2006)
New Revision: 17000

Log:
su: make /etc/shells check configurable
ash: missing ';'


Modified:
   trunk/busybox/libbb/restricted_shell.c
   trunk/busybox/loginutils/Config.in
   trunk/busybox/loginutils/su.c
   trunk/busybox/shell/ash.c


Changeset:
Modified: trunk/busybox/libbb/restricted_shell.c
===================================================================
--- trunk/busybox/libbb/restricted_shell.c	2006-12-18 23:07:42 UTC (rev 16999)
+++ trunk/busybox/libbb/restricted_shell.c	2006-12-19 00:20:20 UTC (rev 17000)
@@ -28,30 +28,19 @@
  * SUCH DAMAGE.
  */
 
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <syslog.h>
-#include <ctype.h>
 #include "libbb.h"
 
-
-
 /* Return 1 if SHELL is a restricted shell (one not returned by
    getusershell), else 0, meaning it is a standard shell.  */
-
-int restricted_shell ( const char *shell )
+int restricted_shell(const char *shell)
 {
 	char *line;
 
-	setusershell ( );
-	while (( line = getusershell ( ))) {
-		if (( *line != '#' ) && ( strcmp ( line, shell ) == 0 ))
-			break;
+	setusershell();
+	while ((line = getusershell())) {
+		if (*line != '#' && strcmp(line, shell) == 0)
+			return 0;
 	}
-	endusershell ( );
-	return line ? 0 : 1;
+	endusershell();
+	return 1;
 }
-

Modified: trunk/busybox/loginutils/Config.in
===================================================================
--- trunk/busybox/loginutils/Config.in	2006-12-18 23:07:42 UTC (rev 16999)
+++ trunk/busybox/loginutils/Config.in	2006-12-19 00:20:20 UTC (rev 17000)
@@ -155,12 +155,15 @@
 	  work properly.
 
 config SU_SYSLOG
-	bool "Support for syslog in su"
+	bool "Enable su to write to syslog"
 	default y
 	depends on SU
-	help
-	  Enables support for syslog in su.
 
+config FEATURE_SU_CHECKS_SHELLS
+	bool "Enable su to check user's shell to be listed in /etc/shells"
+	depends on SU
+	default y
+
 config SULOGIN
 	bool "sulogin"
 	default n

Modified: trunk/busybox/loginutils/su.c
===================================================================
--- trunk/busybox/loginutils/su.c	2006-12-18 23:07:42 UTC (rev 16999)
+++ trunk/busybox/loginutils/su.c	2006-12-19 00:20:20 UTC (rev 17000)
@@ -10,7 +10,7 @@
 
 int su_main(int argc, char **argv)
 {
-	unsigned long flags;
+	unsigned flags;
 	char *opt_shell = 0;
 	char *opt_command = 0;
 	char *opt_username = "root";
@@ -49,19 +49,23 @@
 	}
 
 	pw = getpwnam(opt_username);
-	if (!pw) bb_error_msg_and_die("unknown id: %s", opt_username);
+	if (!pw)	
+		bb_error_msg_and_die("unknown id: %s", opt_username);
 
 	/* Make sure pw->pw_shell is non-NULL.  It may be NULL when NEW_USER
 	   is a username that is retrieved via NIS (YP), but that doesn't have
 	   a default shell listed.  */
-	if (!pw->pw_shell || !pw->pw_shell[0]) pw->pw_shell = (char *)DEFAULT_SHELL;
+	if (!pw->pw_shell || !pw->pw_shell[0])
+		pw->pw_shell = (char *)DEFAULT_SHELL;
 
 	if ((cur_uid == 0) || correct_password(pw)) {
 		if (ENABLE_SU_SYSLOG)
-			syslog(LOG_NOTICE, "+ %s %s:%s", tty, old_user, opt_username);
+			syslog(LOG_NOTICE, "%c %s %s:%s",
+				'+', tty, old_user, opt_username);
 	} else {
 		if (ENABLE_SU_SYSLOG)
-			syslog(LOG_NOTICE, "- %s %s:%s", tty, old_user, opt_username);
+			syslog(LOG_NOTICE, "%c %s %s:%s",
+				'-', tty, old_user, opt_username);
 		bb_error_msg_and_die("incorrect password");
 	}
 
@@ -70,8 +74,10 @@
 		free(old_user);
 	}
 
-	if (!opt_shell && (flags & SU_OPT_mp)) opt_shell = getenv("SHELL");
+	if (!opt_shell && (flags & SU_OPT_mp))
+		opt_shell = getenv("SHELL");
 
+#if ENABLE_FEATURE_SU_CHECKS_SHELLS
 	if (opt_shell && cur_uid && restricted_shell(pw->pw_shell)) {
 		/* The user being su'd to has a nonstandard shell, and so is
 		   probably a uucp account or has restricted access.  Don't
@@ -80,9 +86,10 @@
 		bb_error_msg("using restricted shell");
 		opt_shell = 0;
 	}
+#endif
+	if (!opt_shell)
+		opt_shell = pw->pw_shell;
 
-	if (!opt_shell) opt_shell = pw->pw_shell;
-
 	change_identity(pw);
 	setup_environment(opt_shell, flags & SU_OPT_l, !(flags & SU_OPT_mp), pw);
 	USE_SELINUX(set_current_security_context(NULL);)

Modified: trunk/busybox/shell/ash.c
===================================================================
--- trunk/busybox/shell/ash.c	2006-12-18 23:07:42 UTC (rev 16999)
+++ trunk/busybox/shell/ash.c	2006-12-19 00:20:20 UTC (rev 17000)
@@ -12014,7 +12014,7 @@
 		vallen = strlen(val);
 	}
 	INTOFF;
-	nameeq = ckmalloc(namelen + vallen + 2)
+	nameeq = ckmalloc(namelen + vallen + 2);
 	p = memcpy(nameeq, name, namelen) + namelen;
 	if (val) {
 		*p++ = '=';



More information about the busybox-cvs mailing list