about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2015-12-10 18:15:17 +0100
committerChristian Neukirchen <chneukirchen@gmail.com>2015-12-10 18:15:17 +0100
commita27314927acbf7c9f7ece3aa234970986df1d568 (patch)
tree037b0832f3e7c5f3bd2f69182f5a1b867e006501
parent458cb67fdeb38a634afe78e5fa9d257bc96d3e05 (diff)
downloadxe-a27314927acbf7c9f7ece3aa234970986df1d568.tar.gz
xe-a27314927acbf7c9f7ece3aa234970986df1d568.tar.xz
xe-a27314927acbf7c9f7ece3aa234970986df1d568.zip
limit argmax to sensible values
-rw-r--r--xe.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/xe.c b/xe.c
index 088db49..5983bb9 100644
--- a/xe.c
+++ b/xe.c
@@ -219,7 +219,7 @@ run()
 }
 
 int
-main(int argc, char *argv[])
+main(int argc, char *argv[], char *envp[])
 {
 	char c;
 	int i, cmdend;
@@ -235,7 +235,12 @@ main(int argc, char *argv[])
 		exit(1);
 
 	argmax = sysconf(_SC_ARG_MAX);
-	if (argmax <= 0)
+	while (*envp)  // subtract size of environment
+		argmax -= strlen(*envp++) + 1 + sizeof(*envp);
+	argmax -= 4 * 1024;  // subtract 4k for safety
+	if (argmax > 128 * 1024)  // upper bound
+		argmax = 128 * 1024;
+	if (argmax <= 0) {  // lower bound
 		argmax = _POSIX_ARG_MAX;
 
 	traceout = stdout;