From: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>

From: "Catalin(ux aka Dino) BOIE" <util@deuroconsult.ro>, Paolo 'Blaisorblade'
Giarrusso <blaisorblade@yahoo.it>, Jeff Dike <jdike@addtoit.com> Increase UML
command line size.  And fix a crash from passing an overly-long command line
to UML.

XXX: check that init can handle 128 params and 128 env.  var.  The original
patch set this limit to 256, but it seems me too much.  Think!

Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/arch/um/include/user_util.h |    2 +-
 25-akpm/arch/um/kernel/um_arch.c    |   34 ++++++++++++++++++++--------------
 25-akpm/arch/um/kernel/user_util.c  |   15 ---------------
 25-akpm/include/asm-um/setup.h      |    5 ++++-
 25-akpm/init/Kconfig                |    8 ++++++++
 25-akpm/init/main.c                 |    4 ++--
 6 files changed, 35 insertions(+), 33 deletions(-)

diff -puN arch/um/include/user_util.h~uml-extend-cmd-line-limits arch/um/include/user_util.h
--- 25/arch/um/include/user_util.h~uml-extend-cmd-line-limits	2005-03-23 01:20:25.000000000 -0800
+++ 25-akpm/arch/um/include/user_util.h	2005-03-23 01:20:25.000000000 -0800
@@ -67,7 +67,7 @@ extern void *um_kmalloc(int size);
 extern int switcheroo(int fd, int prot, void *from, void *to, int size);
 extern void setup_machinename(char *machine_out);
 extern void setup_hostinfo(void);
-extern void add_arg(char *cmd_line, char *arg);
+extern void add_arg(char *arg);
 extern void init_new_thread_stack(void *sig_stack, void (*usr1_handler)(int));
 extern void init_new_thread_signals(int altstack);
 extern void do_exec(int old_pid, int new_pid);
diff -puN arch/um/kernel/um_arch.c~uml-extend-cmd-line-limits arch/um/kernel/um_arch.c
--- 25/arch/um/kernel/um_arch.c~uml-extend-cmd-line-limits	2005-03-23 01:20:25.000000000 -0800
+++ 25-akpm/arch/um/kernel/um_arch.c	2005-03-23 01:20:25.000000000 -0800
@@ -25,6 +25,7 @@
 #include "asm/user.h"
 #include "ubd_user.h"
 #include "asm/current.h"
+#include "asm/setup.h"
 #include "user_util.h"
 #include "kern_util.h"
 #include "kern.h"
@@ -40,6 +41,20 @@
 
 #define DEFAULT_COMMAND_LINE "root=98:0"
 
+/* Changed in linux_main and setup_arch, which run before SMP is started */
+char command_line[COMMAND_LINE_SIZE] = { 0 };
+
+void add_arg(char *arg)
+{
+	if (strlen(command_line) + strlen(arg) + 1 > COMMAND_LINE_SIZE) {
+		printf("add_arg: Too much command line!\n");
+		exit(1);
+	}
+	if(strlen(command_line) > 0)
+		strcat(command_line, " ");
+	strcat(command_line, arg);
+}
+
 struct cpuinfo_um boot_cpu_data = { 
 	.loops_per_jiffy	= 0,
 	.ipi_pipe		= { -1, -1 }
@@ -314,9 +329,11 @@ int linux_main(int argc, char **argv)
 		if((i == 1) && (argv[i][0] == ' ')) continue;
 		add = 1;
 		uml_checksetup(argv[i], &add);
-		if(add) add_arg(saved_command_line, argv[i]);
+		if (add)
+			add_arg(argv[i]);
 	}
-	if(have_root == 0) add_arg(saved_command_line, DEFAULT_COMMAND_LINE);
+	if(have_root == 0)
+		add_arg(DEFAULT_COMMAND_LINE);
 
 	mode_tt = force_tt ? 1 : !can_do_skas();
 #ifndef CONFIG_MODE_TT
@@ -432,7 +449,7 @@ void __init setup_arch(char **cmdline_p)
 {
 	notifier_chain_register(&panic_notifier_list, &panic_exit_notifier);
 	paging_init();
- 	strcpy(command_line, saved_command_line);
+ 	strlcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
  	*cmdline_p = command_line;
 	setup_hostinfo();
 }
@@ -448,14 +465,3 @@ void __init check_bugs(void)
 void apply_alternatives(void *start, void *end)
 {
 }
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
diff -puN arch/um/kernel/user_util.c~uml-extend-cmd-line-limits arch/um/kernel/user_util.c
--- 25/arch/um/kernel/user_util.c~uml-extend-cmd-line-limits	2005-03-23 01:20:25.000000000 -0800
+++ 25-akpm/arch/um/kernel/user_util.c	2005-03-23 01:20:25.000000000 -0800
@@ -31,21 +31,6 @@
 #include "ptrace_user.h"
 #include "uml-config.h"
 
-#define COMMAND_LINE_SIZE _POSIX_ARG_MAX
-
-/* Changed in linux_main and setup_arch, which run before SMP is started */
-char command_line[COMMAND_LINE_SIZE] = { 0 };
-
-void add_arg(char *cmd_line, char *arg)
-{
-	if (strlen(cmd_line) + strlen(arg) + 1 > COMMAND_LINE_SIZE) {
-		printf("add_arg: Too much command line!\n");
-		exit(1);
-	}
-	if(strlen(cmd_line) > 0) strcat(cmd_line, " ");
-	strcat(cmd_line, arg);
-}
-
 void stop(void)
 {
 	while(1) sleep(1000000);
diff -puN include/asm-um/setup.h~uml-extend-cmd-line-limits include/asm-um/setup.h
--- 25/include/asm-um/setup.h~uml-extend-cmd-line-limits	2005-03-23 01:20:25.000000000 -0800
+++ 25-akpm/include/asm-um/setup.h	2005-03-23 01:20:25.000000000 -0800
@@ -1,6 +1,9 @@
 #ifndef SETUP_H_INCLUDED
 #define SETUP_H_INCLUDED
 
-#define COMMAND_LINE_SIZE 512
+/* POSIX mandated with _POSIX_ARG_MAX that we can rely on 4096 chars in the
+ * command line, so this choice is ok.*/
+
+#define COMMAND_LINE_SIZE 4096
 
 #endif		/* SETUP_H_INCLUDED */
diff -puN init/Kconfig~uml-extend-cmd-line-limits init/Kconfig
--- 25/init/Kconfig~uml-extend-cmd-line-limits	2005-03-23 01:20:25.000000000 -0800
+++ 25-akpm/init/Kconfig	2005-03-23 01:20:25.000000000 -0800
@@ -55,6 +55,14 @@ config LOCK_KERNEL
 	depends on SMP || PREEMPT
 	default y
 
+config INIT_ENV_ARG_LIMIT
+	int
+	default 32 if !USERMODE
+	default 128 if USERMODE
+	help
+	  This is the value of the two limits on the number of argument and of
+	  env.var passed to init from the kernel command line.
+
 endmenu
 
 menu "General setup"
diff -puN init/main.c~uml-extend-cmd-line-limits init/main.c
--- 25/init/main.c~uml-extend-cmd-line-limits	2005-03-23 01:20:25.000000000 -0800
+++ 25-akpm/init/main.c	2005-03-23 01:20:25.000000000 -0800
@@ -110,8 +110,8 @@ EXPORT_SYMBOL(system_state);
 /*
  * Boot command-line arguments
  */
-#define MAX_INIT_ARGS 32
-#define MAX_INIT_ENVS 32
+#define MAX_INIT_ARGS CONFIG_INIT_ENV_ARG_LIMIT
+#define MAX_INIT_ENVS CONFIG_INIT_ENV_ARG_LIMIT
 
 extern void time_init(void);
 /* Default late time init is NULL. archs can override this later. */
_