mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
command -x: tweak args list size detection (re: 9ddb45b1)
src/cmd/ksh93/features/externs: ARG_EXTRA_BYTES detection: - Improve detection of extra bytes per argument: on every loop iteration, recalculate the size of the environment while taking the amount extra bytes we're currently trying into account. Also count arguments (argv[]) as they are stored in the same buffer. On 64-bit Linux with glibc, this now detects 9 extra bytes per argument instead of 8. An odd number (literally and figuratively) but apparently it needs it; I do think my method is correct now. On 64-bit Solaris and macOS, this still detects 8 extra bytes. (On 64-bit Linux with musl C library, it detects 0 bytes. Nice.) src/cmd/ksh93/sh/path.c: path_xargs(): - Remove the kludge subtracting twice the size of the environment. With the feature test fixed, this should no longer fail on Linux. - Take into account the size of the final null element in the argument and environment lists. src/cmd/ksh93/tests/path.sh: - Do not use awk for the test due to breakage in the system awks on Solaris/Illumos (hangs) and AIX & UnixWare (drops arguments). Instead, use (wait for it...) ksh. It's a bit slower, but works.
This commit is contained in:
parent
8c1e9971a7
commit
6f6b22016a
3 changed files with 31 additions and 22 deletions
|
|
@ -164,11 +164,12 @@ static pid_t path_xargs(Shell_t *shp,const char *path, char *argv[],char *const
|
|||
return((pid_t)-1);
|
||||
size = shp->gd->lim.arg_max - (ARG_EXTRA_BYTES > 2 ? 1024*ARG_EXTRA_BYTES : 2048);
|
||||
for(ev=envp; cp= *ev; ev++)
|
||||
size -= 2 * (strlen(cp) + 1 + ARG_EXTRA_BYTES);
|
||||
size -= strlen(cp) + 1 + ARG_EXTRA_BYTES;
|
||||
for(av=argv; (cp= *av) && av< &argv[shp->xargmin]; av++)
|
||||
size -= strlen(cp) + 1 + ARG_EXTRA_BYTES;
|
||||
for(av=avlast; cp= *av; av++,nlast++)
|
||||
size -= strlen(cp) + 1 + ARG_EXTRA_BYTES;
|
||||
size -= 2 + 2 * ARG_EXTRA_BYTES; /* final null env and arg elements */
|
||||
av = &argv[shp->xargmin];
|
||||
if(!spawn)
|
||||
job_clear();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue