Fix symlink following bug in chmod -R and friends. Allow SYSV style
authorErik Andersen <andersen@codepoet.org>
Tue, 18 Apr 2000 22:09:06 +0000 (22:09 -0000)
committerErik Andersen <andersen@codepoet.org>
Tue, 18 Apr 2000 22:09:06 +0000 (22:09 -0000)
'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

chmod_chown_chgrp.c
utility.c

index 8dd76705427f72f9a37e93c2ee6a46be6239b83e..fb93f3ff81f8d8240c7c69f492fec22e5451e636 100644 (file)
@@ -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);
        }
index 0045e4d7582cece124492a86ba563a02317edc95..773f6a83ed0236af491a1d05c7ead621ef291e01 100644 (file)
--- 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;
                                }
                        }