execve.2: execve also returns E2BIG if a string is too long

The execve syscall returns -E2BIG in 3 cases:
- The total length of the command line arguments and environment is too large.
- An argument or environment string (including the NUL byte) is longer than MAX_ARG_STRLEN.
- The full path to the executable (including the NUL byte) exceeds MAX_ARG_STRLEN.

Spell out all 3 cases in the -E2BIG section.

Discovered by moving a too large commandline parameter to an environment
variable, and finding that things still did not work. Examined the code
in fs/exec.c to get the details.

This simple shell script starts failing at 2^17 on a system with 4kB
page size:
./exec2big.sh: line 10: /bin/true: Argument list too long
fork failed at loop 17

STRING="a"

for loop in `seq 20`; do
	STRING="$STRING$STRING"
	export STRING
	if /bin/true ; then
		: # still under the limit
	else
		echo "fork failed at loop $loop"
	fi
done

Signed-off-by: Rik van Riel <riel@surriel.com>
Suggested-by: Matthew House <mattlloydhouse@gmail.com>
This commit is contained in:
Rik van Riel 2023-10-10 23:30:13 -04:00
parent ae6b221882
commit e52ca1bf3a
1 changed files with 6 additions and 1 deletions

View File

@ -449,7 +449,12 @@ The total number of bytes in the environment
.RI ( envp )
and argument list
.RI ( argv )
is too large.
is too large,
an argument or environment string is too long,
or the full
.I pathname
of the executable is too long.
The terminating NUL is counted as part of the string length.
.TP
.B EACCES
Search permission is denied on a component of the path prefix of