summaryrefslogtreecommitdiff
blob: 75a06a85880fe55609263b8a3ad6fa0bd07bedc6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
--- busybox-1.22.0/findutils/find.c
+++ busybox-1.22.0-find/findutils/find.c
@@ -1291,9 +1291,27 @@ int find_main(int argc, char **argv) MAI
 int find_main(int argc UNUSED_PARAM, char **argv)
 {
 	int i, firstopt, status = EXIT_SUCCESS;
+	char **past_HLP, *saved;
 
 	INIT_G();
 
+	/* "find -type f" + getopt("+HLP") => disaster.
+	 * Need to avoid getopt running into a non-HLP option.
+	 * Do this by temporarily storing NULL there:
+	 */
+	past_HLP = argv;
+	for (;;) {
+		saved = *++past_HLP;
+		if (!saved)
+			break;
+		if (saved[0] != '-')
+			break;
+		if (!saved[1])
+			break; /* it is "-" */
+		if ((saved+1)[strspn(saved+1, "HLP")] != '\0')
+			break;
+	}
+	*past_HLP = NULL;
 	/* "+": stop on first non-option */
 	i = getopt32(argv, "+HLP");
 	if (i & (1<<0))
@@ -1301,7 +1319,8 @@ int find_main(int argc UNUSED_PARAM, cha
 	if (i & (1<<1))
 		G.recurse_flags |= ACTION_FOLLOWLINKS | ACTION_DANGLING_OK;
 	/* -P is default and is ignored */
-	argv += optind;
+	argv = past_HLP; /* same result as "argv += optind;" */
+	*past_HLP = saved;
 
 	for (firstopt = 0; argv[firstopt]; firstopt++) {
 		if (argv[firstopt][0] == '-')