bin/71513: [PATCH] allow -user/group +/-id constructs in find(1)

Andre Albsmeier andre.albsmeier at siemens.com
Thu Sep 9 00:40:19 PDT 2004


>Number:         71513
>Category:       bin
>Synopsis:       [PATCH] allow -user/group +/-id constructs in find(1)
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Thu Sep 09 07:40:18 GMT 2004
>Closed-Date:
>Last-Modified:
>Originator:     Andre Albsmeier
>Release:        FreeBSD 4.10-STABLE i386
>Organization:
>Environment:

System:

	FreeBSD 4.10-STABLE #0: Thu Aug 5 12:18:13 CEST 2004

>Description:

	find(1) currently doesn't allow the use of -user (-group)
	primaries with numeric arguments and +/- prefixes.

>How-To-Repeat:

	find . -user +999

>Fix:

	The patch below adds this feature. As a side effect, it
	enhances the detection of invalid numerical arguments:
	Before, the command
	
	find . -user 0bla1

	found all files belonging to root. This is now honoured
	with an error message. However, the existing logic to
	detect args which obviously should have been usernames
	was adjusted so commands like

	find . -user bla

	still spit out the "no such user" message as they did
	before (if bla doesn't exist, of course).


--- usr.bin/find/function.c.ORI	Wed Jun 16 19:03:23 2004
+++ usr.bin/find/function.c	Thu Sep  9 09:00:55 2004
@@ -862,7 +862,7 @@
 	PLAN *plan;
 	FTSENT *entry;
 {
-	return entry->fts_statp->st_gid == plan->g_data;
+	COMPARE(entry->fts_statp->st_gid, plan->g_data);
 }
 
 PLAN *
@@ -878,15 +878,19 @@
 	gname = nextarg(option, argvp);
 	ftsoptions &= ~FTS_NOSTAT;
 
+	new = palloc(option);
 	g = getgrnam(gname);
 	if (g == NULL) {
+		char* cp = gname;
+		if( gname[0] == '-' || gname[0] == '+' )
+			gname++;
 		gid = atoi(gname);
 		if (gid == 0 && gname[0] != '0')
 			errx(1, "%s: %s: no such group", option->name, gname);
+		gid = find_parsenum(new, option->name, cp, NULL);
 	} else
 		gid = g->gr_gid;
 
-	new = palloc(option);
 	new->g_data = gid;
 	return new;
 }
@@ -1435,7 +1439,7 @@
 	PLAN *plan;
 	FTSENT *entry;
 {
-	return entry->fts_statp->st_uid == plan->u_data;
+	COMPARE(entry->fts_statp->st_uid, plan->u_data);
 }
 
 PLAN *
@@ -1451,15 +1455,19 @@
 	username = nextarg(option, argvp);
 	ftsoptions &= ~FTS_NOSTAT;
 
+	new = palloc(option);
 	p = getpwnam(username);
 	if (p == NULL) {
+		char* cp = username;
+		if( username[0] == '-' || username[0] == '+' )
+			username++;
 		uid = atoi(username);
 		if (uid == 0 && username[0] != '0')
 			errx(1, "%s: %s: no such user", option->name, username);
+		uid = find_parsenum(new, option->name, cp, NULL);
 	} else
 		uid = p->pw_uid;
 
-	new = palloc(option);
 	new->u_data = uid;
 	return new;
 }

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list