From 7b2831108d762a87860a91c87959a3d04b1c3ed6 Mon Sep 17 00:00:00 2001
From: erik <erik@69ca8d6d-28ef-0310-b511-8ec308f3f277>
Date: Tue, 18 Apr 2000 22:09:06 +0000
Subject: Fix symlink following bug in chmod -R and friends.  Allow SYSV style
 'chown foo:bar' in addition to 'chown foo.bar', and fix a bug in the busybox
 globbing routine such that 'find /dir -name [i]' no longer segfaults.  -Erik

git-svn-id: svn://busybox.net/trunk/busybox@478 69ca8d6d-28ef-0310-b511-8ec308f3f277
---
 chmod_chown_chgrp.c |  6 ++++--
 utility.c           | 17 +++++++++++------
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/chmod_chown_chgrp.c b/chmod_chown_chgrp.c
index 8dd767054..fb93f3ff8 100644
--- a/chmod_chown_chgrp.c
+++ b/chmod_chown_chgrp.c
@@ -48,7 +48,7 @@ static const char chgrp_usage[] = "chgrp [OPTION]... GROUP FILE...\n\n"
 
 	"\nOptions:\n\t-R\tchange files and directories recursively\n";
 static const char chown_usage[] =
-	"chown [OPTION]...  OWNER[.[GROUP] FILE...\n\n"
+	"chown [OPTION]...  OWNER[<.|:>[GROUP] FILE...\n\n"
 	"Change the owner and/or group of each FILE to OWNER and/or GROUP.\n"
 
 	"\nOptions:\n\t-R\tchange files and directories recursively\n";
@@ -140,6 +140,8 @@ int chmod_chown_chgrp_main(int argc, char **argv)
 				goto bad_group;
 		} else {
 			groupName = strchr(*argv, '.');
+			if (groupName == NULL)
+				groupName = strchr(*argv, ':');
 			if (groupName) {
 				*groupName++ = '\0';
 				gid = strtoul(groupName, &p, 10);
@@ -169,7 +171,7 @@ int chmod_chown_chgrp_main(int argc, char **argv)
 		fatalError( "%s: too few arguments\n", invocationName);
 	}
 	while (argc-- > 1) {
-		if (recursiveAction (*(++argv), recursiveFlag, TRUE, FALSE, 
+		if (recursiveAction (*(++argv), recursiveFlag, FALSE, FALSE, 
 					fileAction, fileAction, NULL) == FALSE)
 			exit(FALSE);
 	}
diff --git a/utility.c b/utility.c
index 0045e4d75..773f6a83e 100644
--- a/utility.c
+++ b/utility.c
@@ -1058,6 +1058,7 @@ extern int check_wildcard_match(const char *text, const char *pattern)
 	const char *retryText;
 	int ch;
 	int found;
+	int len;
 
 	retryPat = NULL;
 	retryText = NULL;
@@ -1084,13 +1085,17 @@ extern int check_wildcard_match(const char *text, const char *pattern)
 				if (*text == ch)
 					found = TRUE;
 			}
-			if (found == FALSE)
-				continue;
+			len=strlen(text);
+			if (found == FALSE && len!=0) {
+				return FALSE;
+			}
 			if (found == TRUE) {
-				//printf("Got a match.  pattern='%s'  text='%s'\n", pattern, text);
-				if (retryPat || retryText) {
-					pattern = retryPat;
-					text = ++retryText;
+				if (strlen(pattern)==0 && len==1) {
+					return TRUE;
+				}
+				if (len!=0) {
+					text++;
+					continue;
 				}
 			}
 
-- 
cgit v1.2.3-55-g6feb