From 632bb571357c4cef455c00fb06493810284e544d Mon Sep 17 00:00:00 2001 From: Erik Andersen Date: Tue, 18 Apr 2000 22:09:06 +0000 Subject: [PATCH] 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 --- 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; } } -- 2.25.1