Fix argument parsing in test(1) and chmod(1)
We just take the raw argument list as is. Using arg.h, arguments beginning with - would have been "eaten up". Writing a special "bailout" for arg.h was not a good option, not because it's not impossible (done in 6 LOC), but because it is a shoehorning around a corner case present for a few programs which are broken by design by POSIX.
This commit is contained in:
		
							
								
								
									
										4
									
								
								chmod.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								chmod.c
									
									
									
									
									
								
							| @@ -41,8 +41,8 @@ main(int argc, char *argv[]) | ||||
| 	struct recursor r = { .fn = chmodr, .hist = NULL, .depth = 0, .follow = 'P', .flags = 0}; | ||||
| 	size_t i; | ||||
|  | ||||
| 	argv0 = *(argv++); | ||||
| 	argc--; | ||||
| 	argv0 = argv[0], argc--, argv++; | ||||
|  | ||||
| 	for (; *argv && (*argv)[0] == '-'; argc--, argv++) { | ||||
| 		if (!(*argv)[1]) | ||||
| 			usage(); | ||||
|   | ||||
							
								
								
									
										1
									
								
								chown.c
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								chown.c
									
									
									
									
									
								
							| @@ -52,7 +52,6 @@ main(int argc, char *argv[]) | ||||
| 	struct recursor r = { .fn = chownpwgr, .hist = NULL, .depth = 0, .follow = 'P', .flags = 0}; | ||||
| 	char *owner, *group; | ||||
|  | ||||
|  | ||||
| 	ARGBEGIN { | ||||
| 	case 'h': | ||||
| 		hflag = 1; | ||||
|   | ||||
							
								
								
									
										5
									
								
								test.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								test.c
									
									
									
									
									
								
							| @@ -148,10 +148,7 @@ main(int argc, char *argv[]) | ||||
| 	int (*narg[])(char *[]) = { noarg, onearg, twoarg, threearg, fourarg }; | ||||
| 	size_t len; | ||||
|  | ||||
| 	ARGBEGIN { | ||||
| 	default: | ||||
| 		break; | ||||
| 	} ARGEND; | ||||
| 	argv0 = argv[0], argc--, argv++; | ||||
|  | ||||
| 	len = strlen(argv0); | ||||
| 	if (len && argv0[--len] == '[' && (!len || argv0[--len] == '/') && strcmp(argv[--argc], "]")) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user