NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: bin/37666: xargs: Argument list too long



The following reply was made to PR bin/37666; it has been noted by GNATS.

From: Alan Barrett <apb%cequrux.com@localhost>
To: gnats-bugs%NetBSD.org@localhost, netbsd-bugs%NetBSD.org@localhost
Cc: 
Subject: Re: bin/37666: xargs: Argument list too long
Date: Mon, 7 Jan 2008 10:42:36 +0200

 On Wed, 02 Jan 2008, cheusov%tut.by@localhost wrote:
 >    xargs: cat: Argument list too long
 
 xargs(1) in NetBSD-current takes the environment into account when
 working out how many args it may pass, but xargs(1) in netbsd-4 and
 earlier do not.  I believe that this is the cause of the problem you
 saw.
 
 Please try the appended patch.
 
 --apb (Alan Barrett)
 
 Index: src/usr.bin/xargs/xargs.c
 --- xargs.c    28 Mar 2006 14:27:41 -0000      1.15
 +++ xargs.c    7 Jan 2008 08:38:49 -0000
 @@ -69,13 +69,15 @@
  int           main __P((int, char **));
  static void   usage __P((void));
  
 +extern char **environ;
 +
  int
  main(argc, argv)
        int argc;
        char **argv;
  {
        int ch;
 -      char *p, *bbp, *ebp, **bxp, **exp, **xp;
 +      char *p, *bbp, *ebp, **bxp, **exp, **xp, **ep;
        int cnt, indouble, insingle, nargs, nflag, nline, xflag;
        long arg_max;
        char **av, *argp;
 @@ -99,6 +101,9 @@
        if ((arg_max = sysconf(_SC_ARG_MAX)) == -1)
                errx(1, "sysconf(_SC_ARG_MAX) failed");
        nline = arg_max - 4 * 1024;
 +      for (ep = environ; *ep; ep++) {
 +              nline -= strlen(*ep) + 1 + sizeof(*ep);
 +      }
        nflag = xflag = 0;
        while ((ch = getopt(argc, argv, "0n:ps:tx")) != -1)
                switch(ch) {
 



Home | Main Index | Thread Index | Old Index