Page MenuHomeFreeBSD

D6999.id17954.diff
No OneTemporary

D6999.id17954.diff

Index: sys/kern/kern_exec.c
===================================================================
--- sys/kern/kern_exec.c
+++ sys/kern/kern_exec.c
@@ -1188,7 +1188,7 @@
args->begin_argv = args->buf + length;
args->endp = args->begin_argv;
- args->stringspace = ARG_MAX;
+ args->stringspace = argmax;
/*
* extract arguments first
@@ -1258,14 +1258,14 @@
memset(args, '\0', sizeof(*args));
ofdp = td->td_proc->p_fd;
- if (datalen >= ARG_MAX || fdslen > ofdp->fd_lastfile + 1)
+ if (datalen >= argmax || fdslen > ofdp->fd_lastfile + 1)
return (E2BIG);
error = exec_alloc_args(args);
if (error != 0)
return (error);
args->begin_argv = args->buf;
- args->stringspace = ARG_MAX;
+ args->stringspace = argmax;
if (datalen > 0) {
/*
@@ -1321,7 +1321,7 @@
exec_alloc_args(struct image_args *args)
{
- args->buf = (char *)kmap_alloc_wait(exec_map, PATH_MAX + ARG_MAX);
+ args->buf = (char *)kmap_alloc_wait(exec_map, PATH_MAX + argmax);
return (args->buf != NULL ? 0 : ENOMEM);
}
@@ -1331,7 +1331,7 @@
if (args->buf != NULL) {
kmap_free_wakeup(exec_map, (vm_offset_t)args->buf,
- PATH_MAX + ARG_MAX);
+ PATH_MAX + argmax);
args->buf = NULL;
}
if (args->fname_buf != NULL) {
@@ -1416,7 +1416,7 @@
copyout(pagesizes, (void *)destp, szps);
imgp->pagesizeslen = szps;
- destp -= ARG_MAX - imgp->args->stringspace;
+ destp -= argmax - imgp->args->stringspace;
destp = rounddown2(destp, sizeof(void *));
/*
@@ -1459,7 +1459,7 @@
/*
* Copy out strings - arguments and environment.
*/
- copyout(stringp, (void *)destp, ARG_MAX - imgp->args->stringspace);
+ copyout(stringp, (void *)destp, argmax - imgp->args->stringspace);
/*
* Fill in "ps_strings" struct for ps, w, etc.
Index: sys/kern/kern_mib.c
===================================================================
--- sys/kern/kern_mib.c
+++ sys/kern/kern_mib.c
@@ -112,8 +112,8 @@
SYSCTL_INT(_kern, OID_AUTO, maxusers, CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
&maxusers, 0, "Hint for kernel tuning");
-SYSCTL_INT(_kern, KERN_ARGMAX, argmax, CTLFLAG_RD|CTLFLAG_CAPRD,
- SYSCTL_NULL_INT_PTR, ARG_MAX, "Maximum bytes of argument to execve(2)");
+SYSCTL_INT(_kern, KERN_ARGMAX, argmax, CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
+ &argmax, ARG_MAX, "Maximum bytes of argument to execve(2)");
SYSCTL_INT(_kern, KERN_POSIX1, posix1version, CTLFLAG_RD|CTLFLAG_CAPRD,
SYSCTL_NULL_INT_PTR, _POSIX_VERSION, "Version of POSIX attempting to comply to");
Index: sys/kern/subr_param.c
===================================================================
--- sys/kern/subr_param.c
+++ sys/kern/subr_param.c
@@ -78,6 +78,12 @@
#ifndef MAXFILES
#define MAXFILES (40 + 32 * maxusers)
#endif
+#ifndef ARG_MAX
+#define ARG_MAX 262144
+#endif
+#ifndef _POSIX_ARG_MAX
+#define _POSIX_ARG_MAX 4096
+#endif
static int sysctl_kern_vm_guest(SYSCTL_HANDLER_ARGS);
@@ -106,6 +112,7 @@
u_long dflssiz; /* initial stack size limit */
u_long maxssiz; /* max stack size */
u_long sgrowsiz; /* amount to grow stack */
+int argmax; /* max bytes of argument to exec */
SYSCTL_INT(_kern, OID_AUTO, hz, CTLFLAG_RDTUN | CTLFLAG_NOFETCH, &hz, 0,
"Number of clock ticks per second");
@@ -287,6 +294,11 @@
if (maxpipekva > (VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) / 64)
maxpipekva = (VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) /
64;
+
+ argmax = ARG_MAX;
+ TUNABLE_INT_FETCH("kern.argmax", &argmax);
+ if (argmax < _POSIX_ARG_MAX)
+ argmax = _POSIX_ARG_MAX;
}
/*
Index: sys/sys/proc.h
===================================================================
--- sys/sys/proc.h
+++ sys/sys/proc.h
@@ -919,6 +919,7 @@
extern int lastpid;
extern int nprocs, maxproc; /* Current and max number of procs. */
extern int maxprocperuid; /* Max procs per uid. */
+extern int argmax; /* Max bytes of argument to exec. */
extern u_long ps_arg_cache_limit;
LIST_HEAD(proclist, proc);
Index: sys/vm/vm_init.c
===================================================================
--- sys/vm/vm_init.c
+++ sys/vm/vm_init.c
@@ -264,7 +264,7 @@
* Allocate the pageable submaps.
*/
exec_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr,
- exec_map_entries * round_page(PATH_MAX + ARG_MAX), FALSE);
+ exec_map_entries * round_page(PATH_MAX + argmax), FALSE);
pipe_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr, maxpipekva,
FALSE);
}

File Metadata

Mime Type
text/plain
Expires
Thu, May 21, 3:00 PM (3 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33398027
Default Alt Text
D6999.id17954.diff (4 KB)

Event Timeline