aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2011-08-11 02:27:13 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2011-08-11 02:27:13 +0200
commit87249fbf5090f5118b8d651c2615f02dcec2ff6b (patch)
tree6fc23f1a01c3e1b0f51fc850b35c1c12c5ec358e
parent5845a06c9ed8c16200942d1fba581db90a451cc6 (diff)
downloadbusybox-w32-87249fbf5090f5118b8d651c2615f02dcec2ff6b.tar.gz
busybox-w32-87249fbf5090f5118b8d651c2615f02dcec2ff6b.tar.bz2
busybox-w32-87249fbf5090f5118b8d651c2615f02dcec2ff6b.zip
find: fix a bug in !ENABLE_FEATURE_FIND_XDEV config
A subtle one: wrong pairing of "else"! Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--findutils/find.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/findutils/find.c b/findutils/find.c
index babcda0ed..05f88d2f0 100644
--- a/findutils/find.c
+++ b/findutils/find.c
@@ -336,6 +336,9 @@
336# define FNM_CASEFOLD 0 336# define FNM_CASEFOLD 0
337#endif 337#endif
338 338
339#define dbg(...) ((void)0)
340/* #define dbg(...) bb_error_msg(__VA_ARGS__) */
341
339/* This is a NOEXEC applet. Be very careful! */ 342/* This is a NOEXEC applet. Be very careful! */
340 343
341 344
@@ -469,10 +472,12 @@ static int exec_actions(action ***appp, const char *fileName, const struct stat
469#if ENABLE_FEATURE_FIND_NOT 472#if ENABLE_FEATURE_FIND_NOT
470 if (ap->invert) rc ^= TRUE; 473 if (ap->invert) rc ^= TRUE;
471#endif 474#endif
475 dbg("grp %d action %d rc:0x%x", cur_group, cur_action, rc);
472 if (rc & TRUE) /* current group failed, try next */ 476 if (rc & TRUE) /* current group failed, try next */
473 break; 477 break;
474 } 478 }
475 } 479 }
480 dbg("returning:0x%x", rc ^ TRUE);
476 return rc ^ TRUE; /* restore TRUE bit */ 481 return rc ^ TRUE; /* restore TRUE bit */
477} 482}
478 483
@@ -910,6 +915,8 @@ static action*** parse_params(char **argv)
910 int parm = index_in_strings(params, arg); 915 int parm = index_in_strings(params, arg);
911 const char *arg1 = argv[1]; 916 const char *arg1 = argv[1];
912 917
918 dbg("arg:'%s' arg1:'%s' parm:%d PARM_type:%d", arg, arg1, parm, PARM_type);
919
913 if (parm >= PARM_name) { 920 if (parm >= PARM_name) {
914 /* All options/actions starting from -name require argument */ 921 /* All options/actions starting from -name require argument */
915 if (!arg1) 922 if (!arg1)
@@ -925,18 +932,22 @@ static action*** parse_params(char **argv)
925 * expression is reached. 932 * expression is reached.
926 */ 933 */
927 /* Options */ 934 /* Options */
935 if (0) { }
928#if ENABLE_FEATURE_FIND_XDEV 936#if ENABLE_FEATURE_FIND_XDEV
929 if (parm == OPT_XDEV) { 937 else if (parm == OPT_XDEV) {
938 dbg("%d", __LINE__);
930 G.xdev_on = 1; 939 G.xdev_on = 1;
931 } 940 }
932#endif 941#endif
933#if ENABLE_FEATURE_FIND_MAXDEPTH 942#if ENABLE_FEATURE_FIND_MAXDEPTH
934 else if (parm == OPT_MINDEPTH || parm == OPT_MINDEPTH + 1) { 943 else if (parm == OPT_MINDEPTH || parm == OPT_MINDEPTH + 1) {
944 dbg("%d", __LINE__);
935 G.minmaxdepth[parm - OPT_MINDEPTH] = xatoi_positive(arg1); 945 G.minmaxdepth[parm - OPT_MINDEPTH] = xatoi_positive(arg1);
936 } 946 }
937#endif 947#endif
938#if ENABLE_FEATURE_FIND_DEPTH 948#if ENABLE_FEATURE_FIND_DEPTH
939 else if (parm == OPT_DEPTH) { 949 else if (parm == OPT_DEPTH) {
950 dbg("%d", __LINE__);
940 G.recurse_flags |= ACTION_DEPTHFIRST; 951 G.recurse_flags |= ACTION_DEPTHFIRST;
941 } 952 }
942#endif 953#endif
@@ -951,9 +962,11 @@ static action*** parse_params(char **argv)
951 */ 962 */
952 /* Operators */ 963 /* Operators */
953 else if (parm == PARM_a IF_DESKTOP(|| parm == PARM_and)) { 964 else if (parm == PARM_a IF_DESKTOP(|| parm == PARM_and)) {
965 dbg("%d", __LINE__);
954 /* no further special handling required */ 966 /* no further special handling required */
955 } 967 }
956 else if (parm == PARM_o IF_DESKTOP(|| parm == PARM_or)) { 968 else if (parm == PARM_o IF_DESKTOP(|| parm == PARM_or)) {
969 dbg("%d", __LINE__);
957 /* start new OR group */ 970 /* start new OR group */
958 cur_group++; 971 cur_group++;
959 appp = xrealloc(appp, (cur_group+2) * sizeof(*appp)); 972 appp = xrealloc(appp, (cur_group+2) * sizeof(*appp));
@@ -965,26 +978,31 @@ static action*** parse_params(char **argv)
965 else if (parm == PARM_char_not IF_DESKTOP(|| parm == PARM_not)) { 978 else if (parm == PARM_char_not IF_DESKTOP(|| parm == PARM_not)) {
966 /* also handles "find ! ! -name 'foo*'" */ 979 /* also handles "find ! ! -name 'foo*'" */
967 invert_flag ^= 1; 980 invert_flag ^= 1;
981 dbg("invert_flag:%d", invert_flag);
968 } 982 }
969#endif 983#endif
970 /* Actions */ 984 /* Actions */
971 else if (parm == PARM_print) { 985 else if (parm == PARM_print) {
986 dbg("%d", __LINE__);
972 G.need_print = 0; 987 G.need_print = 0;
973 (void) ALLOC_ACTION(print); 988 (void) ALLOC_ACTION(print);
974 } 989 }
975#if ENABLE_FEATURE_FIND_PRINT0 990#if ENABLE_FEATURE_FIND_PRINT0
976 else if (parm == PARM_print0) { 991 else if (parm == PARM_print0) {
992 dbg("%d", __LINE__);
977 G.need_print = 0; 993 G.need_print = 0;
978 (void) ALLOC_ACTION(print0); 994 (void) ALLOC_ACTION(print0);
979 } 995 }
980#endif 996#endif
981#if ENABLE_FEATURE_FIND_PRUNE 997#if ENABLE_FEATURE_FIND_PRUNE
982 else if (parm == PARM_prune) { 998 else if (parm == PARM_prune) {
999 dbg("%d", __LINE__);
983 (void) ALLOC_ACTION(prune); 1000 (void) ALLOC_ACTION(prune);
984 } 1001 }
985#endif 1002#endif
986#if ENABLE_FEATURE_FIND_DELETE 1003#if ENABLE_FEATURE_FIND_DELETE
987 else if (parm == PARM_delete) { 1004 else if (parm == PARM_delete) {
1005 dbg("%d", __LINE__);
988 G.need_print = 0; 1006 G.need_print = 0;
989 G.recurse_flags |= ACTION_DEPTHFIRST; 1007 G.recurse_flags |= ACTION_DEPTHFIRST;
990 (void) ALLOC_ACTION(delete); 1008 (void) ALLOC_ACTION(delete);
@@ -994,6 +1012,7 @@ static action*** parse_params(char **argv)
994 else if (parm == PARM_exec) { 1012 else if (parm == PARM_exec) {
995 int i; 1013 int i;
996 action_exec *ap; 1014 action_exec *ap;
1015 dbg("%d", __LINE__);
997 G.need_print = 0; 1016 G.need_print = 0;
998 ap = ALLOC_ACTION(exec); 1017 ap = ALLOC_ACTION(exec);
999 ap->exec_argv = ++argv; /* first arg after -exec */ 1018 ap->exec_argv = ++argv; /* first arg after -exec */
@@ -1028,6 +1047,7 @@ static action*** parse_params(char **argv)
1028 char **endarg; 1047 char **endarg;
1029 unsigned nested = 1; 1048 unsigned nested = 1;
1030 1049
1050 dbg("%d", __LINE__);
1031 endarg = argv; 1051 endarg = argv;
1032 while (1) { 1052 while (1) {
1033 if (!*++endarg) 1053 if (!*++endarg)
@@ -1047,6 +1067,7 @@ static action*** parse_params(char **argv)
1047#endif 1067#endif
1048 else if (parm == PARM_name || parm == PARM_iname) { 1068 else if (parm == PARM_name || parm == PARM_iname) {
1049 action_name *ap; 1069 action_name *ap;
1070 dbg("%d", __LINE__);
1050 ap = ALLOC_ACTION(name); 1071 ap = ALLOC_ACTION(name);
1051 ap->pattern = arg1; 1072 ap->pattern = arg1;
1052 ap->iname = (parm == PARM_iname); 1073 ap->iname = (parm == PARM_iname);
@@ -1054,6 +1075,7 @@ static action*** parse_params(char **argv)
1054#if ENABLE_FEATURE_FIND_PATH 1075#if ENABLE_FEATURE_FIND_PATH
1055 else if (parm == PARM_path || parm == PARM_ipath) { 1076 else if (parm == PARM_path || parm == PARM_ipath) {
1056 action_path *ap; 1077 action_path *ap;
1078 dbg("%d", __LINE__);
1057 ap = ALLOC_ACTION(path); 1079 ap = ALLOC_ACTION(path);
1058 ap->pattern = arg1; 1080 ap->pattern = arg1;
1059 ap->ipath = (parm == PARM_ipath); 1081 ap->ipath = (parm == PARM_ipath);
@@ -1062,6 +1084,7 @@ static action*** parse_params(char **argv)
1062#if ENABLE_FEATURE_FIND_REGEX 1084#if ENABLE_FEATURE_FIND_REGEX
1063 else if (parm == PARM_regex) { 1085 else if (parm == PARM_regex) {
1064 action_regex *ap; 1086 action_regex *ap;
1087 dbg("%d", __LINE__);
1065 ap = ALLOC_ACTION(regex); 1088 ap = ALLOC_ACTION(regex);
1066 xregcomp(&ap->compiled_pattern, arg1, 0 /*cflags*/); 1089 xregcomp(&ap->compiled_pattern, arg1, 0 /*cflags*/);
1067 } 1090 }
@@ -1071,6 +1094,7 @@ static action*** parse_params(char **argv)
1071 action_type *ap; 1094 action_type *ap;
1072 ap = ALLOC_ACTION(type); 1095 ap = ALLOC_ACTION(type);
1073 ap->type_mask = find_type(arg1); 1096 ap->type_mask = find_type(arg1);
1097 dbg("created:type mask:%x", ap->type_mask);
1074 } 1098 }
1075#endif 1099#endif
1076#if ENABLE_FEATURE_FIND_PERM 1100#if ENABLE_FEATURE_FIND_PERM
@@ -1081,6 +1105,7 @@ static action*** parse_params(char **argv)
1081 */ 1105 */
1082 else if (parm == PARM_perm) { 1106 else if (parm == PARM_perm) {
1083 action_perm *ap; 1107 action_perm *ap;
1108 dbg("%d", __LINE__);
1084 ap = ALLOC_ACTION(perm); 1109 ap = ALLOC_ACTION(perm);
1085 ap->perm_char = arg1[0]; 1110 ap->perm_char = arg1[0];
1086 arg1 = plus_minus_num(arg1); 1111 arg1 = plus_minus_num(arg1);
@@ -1092,6 +1117,7 @@ static action*** parse_params(char **argv)
1092#if ENABLE_FEATURE_FIND_MTIME 1117#if ENABLE_FEATURE_FIND_MTIME
1093 else if (parm == PARM_mtime) { 1118 else if (parm == PARM_mtime) {
1094 action_mtime *ap; 1119 action_mtime *ap;
1120 dbg("%d", __LINE__);
1095 ap = ALLOC_ACTION(mtime); 1121 ap = ALLOC_ACTION(mtime);
1096 ap->mtime_char = arg1[0]; 1122 ap->mtime_char = arg1[0];
1097 ap->mtime_days = xatoul(plus_minus_num(arg1)); 1123 ap->mtime_days = xatoul(plus_minus_num(arg1));
@@ -1100,6 +1126,7 @@ static action*** parse_params(char **argv)
1100#if ENABLE_FEATURE_FIND_MMIN 1126#if ENABLE_FEATURE_FIND_MMIN
1101 else if (parm == PARM_mmin) { 1127 else if (parm == PARM_mmin) {
1102 action_mmin *ap; 1128 action_mmin *ap;
1129 dbg("%d", __LINE__);
1103 ap = ALLOC_ACTION(mmin); 1130 ap = ALLOC_ACTION(mmin);
1104 ap->mmin_char = arg1[0]; 1131 ap->mmin_char = arg1[0];
1105 ap->mmin_mins = xatoul(plus_minus_num(arg1)); 1132 ap->mmin_mins = xatoul(plus_minus_num(arg1));
@@ -1109,6 +1136,7 @@ static action*** parse_params(char **argv)
1109 else if (parm == PARM_newer) { 1136 else if (parm == PARM_newer) {
1110 struct stat stat_newer; 1137 struct stat stat_newer;
1111 action_newer *ap; 1138 action_newer *ap;
1139 dbg("%d", __LINE__);
1112 ap = ALLOC_ACTION(newer); 1140 ap = ALLOC_ACTION(newer);
1113 xstat(arg1, &stat_newer); 1141 xstat(arg1, &stat_newer);
1114 ap->newer_mtime = stat_newer.st_mtime; 1142 ap->newer_mtime = stat_newer.st_mtime;
@@ -1117,6 +1145,7 @@ static action*** parse_params(char **argv)
1117#if ENABLE_FEATURE_FIND_INUM 1145#if ENABLE_FEATURE_FIND_INUM
1118 else if (parm == PARM_inum) { 1146 else if (parm == PARM_inum) {
1119 action_inum *ap; 1147 action_inum *ap;
1148 dbg("%d", __LINE__);
1120 ap = ALLOC_ACTION(inum); 1149 ap = ALLOC_ACTION(inum);
1121 ap->inode_num = xatoul(arg1); 1150 ap->inode_num = xatoul(arg1);
1122 } 1151 }
@@ -1124,6 +1153,7 @@ static action*** parse_params(char **argv)
1124#if ENABLE_FEATURE_FIND_USER 1153#if ENABLE_FEATURE_FIND_USER
1125 else if (parm == PARM_user) { 1154 else if (parm == PARM_user) {
1126 action_user *ap; 1155 action_user *ap;
1156 dbg("%d", __LINE__);
1127 ap = ALLOC_ACTION(user); 1157 ap = ALLOC_ACTION(user);
1128 ap->uid = bb_strtou(arg1, NULL, 10); 1158 ap->uid = bb_strtou(arg1, NULL, 10);
1129 if (errno) 1159 if (errno)
@@ -1133,6 +1163,7 @@ static action*** parse_params(char **argv)
1133#if ENABLE_FEATURE_FIND_GROUP 1163#if ENABLE_FEATURE_FIND_GROUP
1134 else if (parm == PARM_group) { 1164 else if (parm == PARM_group) {
1135 action_group *ap; 1165 action_group *ap;
1166 dbg("%d", __LINE__);
1136 ap = ALLOC_ACTION(group); 1167 ap = ALLOC_ACTION(group);
1137 ap->gid = bb_strtou(arg1, NULL, 10); 1168 ap->gid = bb_strtou(arg1, NULL, 10);
1138 if (errno) 1169 if (errno)
@@ -1161,6 +1192,7 @@ static action*** parse_params(char **argv)
1161 { "", 0 } 1192 { "", 0 }
1162 }; 1193 };
1163 action_size *ap; 1194 action_size *ap;
1195 dbg("%d", __LINE__);
1164 ap = ALLOC_ACTION(size); 1196 ap = ALLOC_ACTION(size);
1165 ap->size_char = arg1[0]; 1197 ap->size_char = arg1[0];
1166 ap->size = XATOU_SFX(plus_minus_num(arg1), find_suffixes); 1198 ap->size = XATOU_SFX(plus_minus_num(arg1), find_suffixes);
@@ -1169,6 +1201,7 @@ static action*** parse_params(char **argv)
1169#if ENABLE_FEATURE_FIND_CONTEXT 1201#if ENABLE_FEATURE_FIND_CONTEXT
1170 else if (parm == PARM_context) { 1202 else if (parm == PARM_context) {
1171 action_context *ap; 1203 action_context *ap;
1204 dbg("%d", __LINE__);
1172 ap = ALLOC_ACTION(context); 1205 ap = ALLOC_ACTION(context);
1173 /*ap->context = NULL; - ALLOC_ACTION did it */ 1206 /*ap->context = NULL; - ALLOC_ACTION did it */
1174 /* SELinux headers erroneously declare non-const parameter */ 1207 /* SELinux headers erroneously declare non-const parameter */
@@ -1179,6 +1212,7 @@ static action*** parse_params(char **argv)
1179#if ENABLE_FEATURE_FIND_LINKS 1212#if ENABLE_FEATURE_FIND_LINKS
1180 else if (parm == PARM_links) { 1213 else if (parm == PARM_links) {
1181 action_links *ap; 1214 action_links *ap;
1215 dbg("%d", __LINE__);
1182 ap = ALLOC_ACTION(links); 1216 ap = ALLOC_ACTION(links);
1183 ap->links_char = arg1[0]; 1217 ap->links_char = arg1[0];
1184 ap->links_count = xatoul(plus_minus_num(arg1)); 1218 ap->links_count = xatoul(plus_minus_num(arg1));
@@ -1190,6 +1224,7 @@ static action*** parse_params(char **argv)
1190 } 1224 }
1191 argv++; 1225 argv++;
1192 } 1226 }
1227 dbg("exiting %s", __func__);
1193 return appp; 1228 return appp;
1194#undef ALLOC_ACTION 1229#undef ALLOC_ACTION
1195} 1230}