svn commit: trunk/busybox/shell

vda at busybox.net vda at busybox.net
Tue Dec 26 21:31:13 UTC 2006


Author: vda
Date: 2006-12-26 13:31:11 -0800 (Tue, 26 Dec 2006)
New Revision: 17085

Log:
ash: is_safe_applet mustn't affect disabled applets


Modified:
   trunk/busybox/shell/ash.c


Changeset:
Modified: trunk/busybox/shell/ash.c
===================================================================
--- trunk/busybox/shell/ash.c	2006-12-26 18:17:42 UTC (rev 17084)
+++ trunk/busybox/shell/ash.c	2006-12-26 21:31:11 UTC (rev 17085)
@@ -1381,17 +1381,9 @@
 	{ BUILTIN_REGULAR       "wait", waitcmd },
 };
 
-#define NUMBUILTINS  (sizeof (builtincmd) / sizeof (struct builtincmd) )
+#define NUMBUILTINS (sizeof(builtincmd) / sizeof(builtincmd[0]))
 
-static const char *safe_applets[] = { 
-	"[", "test", "echo", "cat",
-	"ln", "cp", "touch", "mkdir", "rm",
-	"cut", "hexdump", "awk", "sort",
-	"find", "xargs", "ls", "dd",
-	"chown", "chmod"
-};
 
-
 struct cmdentry {
 	int cmdtype;
 	union param {
@@ -2042,7 +2034,30 @@
 
 static int is_safe_applet(char *name)
 {
-	int n = sizeof(safe_applets) / sizeof(char *);
+	/* It isn't a bug to have non-existent applet here... */
+	/* ...just a waste of space... */
+	static const char safe_applets[][8] = { 
+		"["
+		USE_AWK    (, "awk"    )
+		USE_CAT    (, "cat"    )
+		USE_CHMOD  (, "chmod"  )
+		USE_CHOWN  (, "chown"  )
+		USE_CP     (, "cp"     )
+		USE_CUT    (, "cut"    )
+		USE_DD     (, "dd"     )
+		USE_ECHO   (, "echo"   )
+		USE_FIND   (, "find"   )
+		USE_HEXDUMP(, "hexdump")
+		USE_LN     (, "ln"     )
+		USE_LS     (, "ls"     )
+		USE_MKDIR  (, "mkdir"  )
+		USE_RM     (, "rm"     )
+		USE_SORT   (, "sort"   )
+		USE_TEST   (, "test"   )
+		USE_TOUCH  (, "touch"  )
+		USE_XARGS  (, "xargs"  )
+	};
+	int n = sizeof(safe_applets) / sizeof(safe_applets[0]);
 	int i;
 	for (i = 0; i < n; i++)
 		if (strcmp(safe_applets[i], name) == 0)
@@ -3702,12 +3717,11 @@
 
 	clearredir(1);
 	envp = environment();
-	if (strchr(argv[0], '/') != NULL
-		|| is_safe_applet(argv[0])
+	if (strchr(argv[0], '/')
 #ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
-		|| find_applet_by_name(argv[0])
+	 || find_applet_by_name(argv[0])
 #endif
-						) {
+	) {
 		tryexec(argv[0], argv, envp);
 		e = errno;
 	} else {
@@ -3750,7 +3764,10 @@
 	int argc = 0;
 	char **c;
 	
-	if(strchr(cmd, '/') == NULL && is_safe_applet(cmd) && (a = find_applet_by_name(cmd)) != NULL) {
+	if (strchr(cmd, '/') == NULL
+	 && (a = find_applet_by_name(cmd)) != NULL
+	 && is_safe_applet(cmd)
+	) {
 		c = argv;
 		while (*c != NULL) {
 			c++; argc++;
@@ -3759,7 +3776,7 @@
 		exit(a->main(argc, argv));
 	}
 #ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
-	if(find_applet_by_name(cmd) != NULL) {
+	if (find_applet_by_name(cmd) != NULL) {
 		/* re-exec ourselves with the new arguments */
 		execve(CONFIG_BUSYBOX_EXEC_PATH,argv,envp);
 		/* If they called chroot or otherwise made the binary no longer




More information about the busybox-cvs mailing list