Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 31 Oct 1996 09:50:27 -0700 (MST)
From:      Marc Slemko <marcs@znep.com>
To:        Nathan Lawson <nlawson@kdat.csc.calpoly.edu>
Cc:        freebsd-security@freebsd.org
Subject:   Re: /etc/security
Message-ID:  <Pine.BSF.3.95.961031093503.12929A-100000@alive.ampr.ab.ca>
In-Reply-To: <199610311610.IAA20880@kdat.calpoly.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 31 Oct 1996, Nathan Lawson wrote:

> > <<On Thu, 31 Oct 1996 08:18:58 +0100, sthaug@nethelp.no said:
> > 
> > >> checking setuid files and devices:
> > >> find: /doscopy/sb16/pro_org/i'vebeen.org: illegal path
> > >> find: /doscopy/sb16/pro_org/she'llbe.org: illegal path
> > 
> > The best way to deal with this is probably using the `-print0' primary
> > to `find' and using a `perl -n0' script to process the results, like:
> > 
> > 	find ..... -print0 | perl -n0e 'exec "/bin/ls", "-lFgod", <>;'
> 
> Yes, the -print0 option is useful, but to avoid executing another interpreter
> just for the task of filtering out the NULLs, I prefer to use xargs -0
> 
> >From the man page:
>      -0      Changes xargs to expect NUL (``\0'') characters as seperators,
>              instead of spaces and newlines.  This is expected to be used in
>              concert with the -print0 function in find.
> 
> This avoids execing a costly interpreter and keeps the scripts using xargs,
> which is useful with very long path lists.

Except for the minor problem that xargs does not have a -0 option
on FreeBSD.  GNU xargs does and OpenBSD xargs does.  Below is the
diff from OpenBSD to implement the change.  I think it is a worthwhile
change, although I haven't really looked too much at the OpenBSD
way of doing it to see if it is a good implementation.

Index: xargs.c
===================================================================
RCS file: /cvs/src/usr.bin/xargs/xargs.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -c -r1.1 -r1.2
*** xargs.c	1995/10/18 08:47:00	1.1
--- xargs.c	1996/06/11 06:48:06	1.2
***************
*** 62,67 ****
--- 62,68 ----
  #include "pathnames.h"
  
  int tflag, rval;
+ int zflag;
  
  void run __P((char **));
  void usage __P((void));
***************
*** 94,100 ****
  	nargs = 5000;
  	nline = ARG_MAX - 4 * 1024;
  	nflag = xflag = 0;
! 	while ((ch = getopt(argc, argv, "n:s:tx")) != EOF)
  		switch(ch) {
  		case 'n':
  			nflag = 1;
--- 95,101 ----
  	nargs = 5000;
  	nline = ARG_MAX - 4 * 1024;
  	nflag = xflag = 0;
! 	while ((ch = getopt(argc, argv, "0n:s:tx")) != EOF)
  		switch(ch) {
  		case 'n':
  			nflag = 1;
***************
*** 110,115 ****
--- 111,119 ----
  		case 'x':
  			xflag = 1;
  			break;
+ 		case '0':
+ 			zflag = 1;
+ 			break;
  		case '?':
  		default:
  			usage();
***************
*** 183,192 ****
  		case ' ':
  		case '\t':
  			/* Quotes escape tabs and spaces. */
! 			if (insingle || indouble)
  				goto addch;
  			goto arg2;
  		case '\n':
  			/* Empty lines are skipped. */
  			if (argp == p)
  				continue;
--- 187,203 ----
  		case ' ':
  		case '\t':
  			/* Quotes escape tabs and spaces. */
! 			if (insingle || indouble || zflag)
  				goto addch;
  			goto arg2;
+ 		case '\0':
+ 			if (zflag)
+ 				goto arg2;
+ 			goto addch;
  		case '\n':
+ 			if (zflag)
+ 				goto addch;
+ 
  			/* Empty lines are skipped. */
  			if (argp == p)
  				continue;
***************
*** 217,232 ****
  			argp = p;
  			break;
  		case '\'':
! 			if (indouble)
  				goto addch;
  			insingle = !insingle;
  			break;
  		case '"':
! 			if (insingle)
  				goto addch;
  			indouble = !indouble;
  			break;
  		case '\\':
  			/* Backslash escapes anything, is escaped by quotes. */
  			if (!insingle && !indouble && (ch = getchar()) == EOF)
  				errx(1, "backslash at EOF");
--- 228,245 ----
  			argp = p;
  			break;
  		case '\'':
! 			if (indouble || zflag)
  				goto addch;
  			insingle = !insingle;
  			break;
  		case '"':
! 			if (insingle || zflag)
  				goto addch;
  			indouble = !indouble;
  			break;
  		case '\\':
+ 			if (zflag)
+ 				goto addch;
  			/* Backslash escapes anything, is escaped by quotes. */
  			if (!insingle && !indouble && (ch = getchar()) == EOF)
  				errx(1, "backslash at EOF");
***************
*** 316,321 ****
  usage()
  {
  	(void)fprintf(stderr,
! "usage: xargs [-t] [-n number [-x]] [-s size] [utility [argument ...]]\n");
  	exit(1);
  }
--- 329,334 ----
  usage()
  {
  	(void)fprintf(stderr,
! "usage: xargs [-0] [-t] [-n number [-x]] [-s size] [utility [argument ...]]\n");
  	exit(1);
  }
Index: xargs.1
===================================================================
RCS file: /cvs/src/usr.bin/xargs/xargs.1,v
retrieving revision 1.1
retrieving revision 1.3
diff -c -r1.1 -r1.3
*** xargs.1	1995/10/18 08:47:00	1.1
--- xargs.1	1996/06/11 06:56:57	1.3
***************
*** 45,50 ****
--- 45,51 ----
  .Nd "construct argument list(s) and execute utility"
  .Sh SYNOPSIS
  .Nm xargs
+ .Op Fl 0
  .Op Fl t
  .Oo Op Fl x
  .Fl n Ar number
***************
*** 81,86 ****
--- 82,97 ----
  .Pp
  The options are as follows:
  .Bl -tag -width indent
+ .It Fl 0
+ Changes
+ .Nm xargs
+ to expect NUL
+ (``\\0'')
+ characters as seperators, instead of spaces and newlines.
+ This is expected to be used in concert with the
+ .Fl print0
+ function in
+ .Nm find .
  .It Fl n Ar number
  Set the maximum number of arguments taken from standard input for each
  invocation of the utility.







Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.95.961031093503.12929A-100000>