From 87249fbf5090f5118b8d651c2615f02dcec2ff6b Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 11 Aug 2011 02:27:13 +0200 Subject: find: fix a bug in !ENABLE_FEATURE_FIND_XDEV config A subtle one: wrong pairing of "else"! Signed-off-by: Denys Vlasenko --- findutils/find.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) (limited to 'findutils/find.c') 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 @@ # define FNM_CASEFOLD 0 #endif +#define dbg(...) ((void)0) +/* #define dbg(...) bb_error_msg(__VA_ARGS__) */ + /* This is a NOEXEC applet. Be very careful! */ @@ -469,10 +472,12 @@ static int exec_actions(action ***appp, const char *fileName, const struct stat #if ENABLE_FEATURE_FIND_NOT if (ap->invert) rc ^= TRUE; #endif + dbg("grp %d action %d rc:0x%x", cur_group, cur_action, rc); if (rc & TRUE) /* current group failed, try next */ break; } } + dbg("returning:0x%x", rc ^ TRUE); return rc ^ TRUE; /* restore TRUE bit */ } @@ -910,6 +915,8 @@ static action*** parse_params(char **argv) int parm = index_in_strings(params, arg); const char *arg1 = argv[1]; + dbg("arg:'%s' arg1:'%s' parm:%d PARM_type:%d", arg, arg1, parm, PARM_type); + if (parm >= PARM_name) { /* All options/actions starting from -name require argument */ if (!arg1) @@ -925,18 +932,22 @@ static action*** parse_params(char **argv) * expression is reached. */ /* Options */ + if (0) { } #if ENABLE_FEATURE_FIND_XDEV - if (parm == OPT_XDEV) { + else if (parm == OPT_XDEV) { + dbg("%d", __LINE__); G.xdev_on = 1; } #endif #if ENABLE_FEATURE_FIND_MAXDEPTH else if (parm == OPT_MINDEPTH || parm == OPT_MINDEPTH + 1) { + dbg("%d", __LINE__); G.minmaxdepth[parm - OPT_MINDEPTH] = xatoi_positive(arg1); } #endif #if ENABLE_FEATURE_FIND_DEPTH else if (parm == OPT_DEPTH) { + dbg("%d", __LINE__); G.recurse_flags |= ACTION_DEPTHFIRST; } #endif @@ -951,9 +962,11 @@ static action*** parse_params(char **argv) */ /* Operators */ else if (parm == PARM_a IF_DESKTOP(|| parm == PARM_and)) { + dbg("%d", __LINE__); /* no further special handling required */ } else if (parm == PARM_o IF_DESKTOP(|| parm == PARM_or)) { + dbg("%d", __LINE__); /* start new OR group */ cur_group++; appp = xrealloc(appp, (cur_group+2) * sizeof(*appp)); @@ -965,26 +978,31 @@ static action*** parse_params(char **argv) else if (parm == PARM_char_not IF_DESKTOP(|| parm == PARM_not)) { /* also handles "find ! ! -name 'foo*'" */ invert_flag ^= 1; + dbg("invert_flag:%d", invert_flag); } #endif /* Actions */ else if (parm == PARM_print) { + dbg("%d", __LINE__); G.need_print = 0; (void) ALLOC_ACTION(print); } #if ENABLE_FEATURE_FIND_PRINT0 else if (parm == PARM_print0) { + dbg("%d", __LINE__); G.need_print = 0; (void) ALLOC_ACTION(print0); } #endif #if ENABLE_FEATURE_FIND_PRUNE else if (parm == PARM_prune) { + dbg("%d", __LINE__); (void) ALLOC_ACTION(prune); } #endif #if ENABLE_FEATURE_FIND_DELETE else if (parm == PARM_delete) { + dbg("%d", __LINE__); G.need_print = 0; G.recurse_flags |= ACTION_DEPTHFIRST; (void) ALLOC_ACTION(delete); @@ -994,6 +1012,7 @@ static action*** parse_params(char **argv) else if (parm == PARM_exec) { int i; action_exec *ap; + dbg("%d", __LINE__); G.need_print = 0; ap = ALLOC_ACTION(exec); ap->exec_argv = ++argv; /* first arg after -exec */ @@ -1028,6 +1047,7 @@ static action*** parse_params(char **argv) char **endarg; unsigned nested = 1; + dbg("%d", __LINE__); endarg = argv; while (1) { if (!*++endarg) @@ -1047,6 +1067,7 @@ static action*** parse_params(char **argv) #endif else if (parm == PARM_name || parm == PARM_iname) { action_name *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(name); ap->pattern = arg1; ap->iname = (parm == PARM_iname); @@ -1054,6 +1075,7 @@ static action*** parse_params(char **argv) #if ENABLE_FEATURE_FIND_PATH else if (parm == PARM_path || parm == PARM_ipath) { action_path *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(path); ap->pattern = arg1; ap->ipath = (parm == PARM_ipath); @@ -1062,6 +1084,7 @@ static action*** parse_params(char **argv) #if ENABLE_FEATURE_FIND_REGEX else if (parm == PARM_regex) { action_regex *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(regex); xregcomp(&ap->compiled_pattern, arg1, 0 /*cflags*/); } @@ -1071,6 +1094,7 @@ static action*** parse_params(char **argv) action_type *ap; ap = ALLOC_ACTION(type); ap->type_mask = find_type(arg1); + dbg("created:type mask:%x", ap->type_mask); } #endif #if ENABLE_FEATURE_FIND_PERM @@ -1081,6 +1105,7 @@ static action*** parse_params(char **argv) */ else if (parm == PARM_perm) { action_perm *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(perm); ap->perm_char = arg1[0]; arg1 = plus_minus_num(arg1); @@ -1092,6 +1117,7 @@ static action*** parse_params(char **argv) #if ENABLE_FEATURE_FIND_MTIME else if (parm == PARM_mtime) { action_mtime *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(mtime); ap->mtime_char = arg1[0]; ap->mtime_days = xatoul(plus_minus_num(arg1)); @@ -1100,6 +1126,7 @@ static action*** parse_params(char **argv) #if ENABLE_FEATURE_FIND_MMIN else if (parm == PARM_mmin) { action_mmin *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(mmin); ap->mmin_char = arg1[0]; ap->mmin_mins = xatoul(plus_minus_num(arg1)); @@ -1109,6 +1136,7 @@ static action*** parse_params(char **argv) else if (parm == PARM_newer) { struct stat stat_newer; action_newer *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(newer); xstat(arg1, &stat_newer); ap->newer_mtime = stat_newer.st_mtime; @@ -1117,6 +1145,7 @@ static action*** parse_params(char **argv) #if ENABLE_FEATURE_FIND_INUM else if (parm == PARM_inum) { action_inum *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(inum); ap->inode_num = xatoul(arg1); } @@ -1124,6 +1153,7 @@ static action*** parse_params(char **argv) #if ENABLE_FEATURE_FIND_USER else if (parm == PARM_user) { action_user *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(user); ap->uid = bb_strtou(arg1, NULL, 10); if (errno) @@ -1133,6 +1163,7 @@ static action*** parse_params(char **argv) #if ENABLE_FEATURE_FIND_GROUP else if (parm == PARM_group) { action_group *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(group); ap->gid = bb_strtou(arg1, NULL, 10); if (errno) @@ -1161,6 +1192,7 @@ static action*** parse_params(char **argv) { "", 0 } }; action_size *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(size); ap->size_char = arg1[0]; ap->size = XATOU_SFX(plus_minus_num(arg1), find_suffixes); @@ -1169,6 +1201,7 @@ static action*** parse_params(char **argv) #if ENABLE_FEATURE_FIND_CONTEXT else if (parm == PARM_context) { action_context *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(context); /*ap->context = NULL; - ALLOC_ACTION did it */ /* SELinux headers erroneously declare non-const parameter */ @@ -1179,6 +1212,7 @@ static action*** parse_params(char **argv) #if ENABLE_FEATURE_FIND_LINKS else if (parm == PARM_links) { action_links *ap; + dbg("%d", __LINE__); ap = ALLOC_ACTION(links); ap->links_char = arg1[0]; ap->links_count = xatoul(plus_minus_num(arg1)); @@ -1190,6 +1224,7 @@ static action*** parse_params(char **argv) } argv++; } + dbg("exiting %s", __func__); return appp; #undef ALLOC_ACTION } -- cgit v1.2.3