Possible fix for Coverity CID#7:
convert options() prototype to unsigned (size_t, in fact), and make an explicitly casted (size_t)-1 the error return code, modelled after what is often used in Unix libraries
This commit is contained in:
		
							
								
								
									
										28
									
								
								funcs.c
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								funcs.c
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | ||||
|  | ||||
| #include "sh.h" | ||||
|  | ||||
| __RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.51 2007/05/13 18:15:25 tg Exp $"); | ||||
| __RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.52 2007/05/13 18:33:28 tg Exp $"); | ||||
|  | ||||
| int | ||||
| c_cd(const char **wp) | ||||
| @@ -2517,8 +2517,8 @@ int | ||||
| test_eval(Test_env *te, Test_op op, const char *opnd1, const char *opnd2, | ||||
|     int do_eval) | ||||
| { | ||||
| 	int res; | ||||
| 	int not; | ||||
| 	int i; | ||||
| 	size_t k; | ||||
| 	struct stat b1, b2; | ||||
|  | ||||
| 	if (!do_eval) | ||||
| @@ -2533,16 +2533,16 @@ test_eval(Test_env *te, Test_op op, const char *opnd1, const char *opnd2, | ||||
| 	case TO_STZER: /* -z */ | ||||
| 		return *opnd1 == '\0'; | ||||
| 	case TO_OPTION: /* -o */ | ||||
| 		if ((not = *opnd1 == '!')) | ||||
| 		if ((i = *opnd1 == '!')) | ||||
| 			opnd1++; | ||||
| 		if ((res = option(opnd1)) < 0) | ||||
| 			res = 0; | ||||
| 		if ((k = option(opnd1)) == (size_t)-1) | ||||
| 			k = 0; | ||||
| 		else { | ||||
| 			res = Flag(res); | ||||
| 			if (not) | ||||
| 				res = !res; | ||||
| 			k = Flag(k); | ||||
| 			if (i) | ||||
| 				k = !k; | ||||
| 		} | ||||
| 		return res; | ||||
| 		return k; | ||||
| 	case TO_FILRD: /* -r */ | ||||
| 		return test_eaccess(opnd1, R_OK) == 0; | ||||
| 	case TO_FILWR: /* -w */ | ||||
| @@ -2584,12 +2584,12 @@ test_eval(Test_env *te, Test_op op, const char *opnd1, const char *opnd2, | ||||
| 	case TO_FILGZ: /* -s */ | ||||
| 		return stat(opnd1, &b1) == 0 && b1.st_size > 0L; | ||||
| 	case TO_FILTT: /* -t */ | ||||
| 		if (opnd1 && !bi_getn(opnd1, &res)) { | ||||
| 		if (opnd1 && !bi_getn(opnd1, &i)) { | ||||
| 			te->flags |= TEF_ERROR; | ||||
| 			res = 0; | ||||
| 			i = 0; | ||||
| 		} else | ||||
| 			res = isatty(opnd1 ? res : 0); | ||||
| 		return res; | ||||
| 			i = isatty(opnd1 ? i : 0); | ||||
| 		return (i); | ||||
| 	case TO_FILUID: /* -O */ | ||||
| 		return stat(opnd1, &b1) == 0 && b1.st_uid == ksheuid; | ||||
| 	case TO_FILGID: /* -G */ | ||||
|   | ||||
							
								
								
									
										18
									
								
								misc.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								misc.c
									
									
									
									
									
								
							| @@ -6,7 +6,7 @@ | ||||
| #include <grp.h> | ||||
| #endif | ||||
|  | ||||
| __RCSID("$MirOS: src/bin/mksh/misc.c,v 1.53 2007/05/13 17:51:23 tg Exp $\t" | ||||
| __RCSID("$MirOS: src/bin/mksh/misc.c,v 1.54 2007/05/13 18:33:29 tg Exp $\t" | ||||
| 	MKSH_SH_H_ID); | ||||
|  | ||||
| #undef USE_CHVT | ||||
| @@ -145,16 +145,16 @@ const struct option options[] = { | ||||
| /* | ||||
|  * translate -o option into F* constant (also used for test -o option) | ||||
|  */ | ||||
| int | ||||
| size_t | ||||
| option(const char *n) | ||||
| { | ||||
| 	unsigned i; | ||||
| 	size_t i; | ||||
|  | ||||
| 	for (i = 0; i < NELEM(options); i++) | ||||
| 		if (options[i].name && strcmp(options[i].name, n) == 0) | ||||
| 			return i; | ||||
| 			return (i); | ||||
|  | ||||
| 	return -1; | ||||
| 	return ((size_t)-1); | ||||
| } | ||||
|  | ||||
| struct options_info { | ||||
| @@ -277,8 +277,8 @@ parse_args(const char **argv, | ||||
| 	char *opts; | ||||
| 	const char *array = NULL; | ||||
| 	Getopt go; | ||||
| 	size_t i; | ||||
| 	int optc, set, sortargs = 0, arrayset = 0; | ||||
| 	unsigned i; | ||||
|  | ||||
| 	/* First call?  Build option strings... */ | ||||
| 	if (cmd_opts[0] == '\0') { | ||||
| @@ -350,18 +350,18 @@ parse_args(const char **argv, | ||||
| 				break; | ||||
| 			} | ||||
| 			i = option(go.optarg); | ||||
| 			if (i != (unsigned)-1 && set == Flag(i)) | ||||
| 			if ((i != (size_t)-1) && set == Flag(i)) | ||||
| 				/* Don't check the context if the flag | ||||
| 				 * isn't changing - makes "set -o interactive" | ||||
| 				 * work if you're already interactive.  Needed | ||||
| 				 * if the output of "set +o" is to be used. | ||||
| 				 */ | ||||
| 				; | ||||
| 			else if (i != (unsigned)-1 && (options[i].flags & what)) | ||||
| 			else if ((i != (size_t)-1) && (options[i].flags & what)) | ||||
| 				change_flag((enum sh_flag)i, what, set); | ||||
| 			else { | ||||
| 				bi_errorf("%s: bad option", go.optarg); | ||||
| 				return -1; | ||||
| 				return (-1); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
|   | ||||
							
								
								
									
										4
									
								
								sh.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								sh.h
									
									
									
									
									
								
							| @@ -8,7 +8,7 @@ | ||||
| /*	$OpenBSD: c_test.h,v 1.4 2004/12/20 11:34:26 otto Exp $	*/ | ||||
| /*	$OpenBSD: tty.h,v 1.5 2004/12/20 11:34:26 otto Exp $	*/ | ||||
|  | ||||
| #define MKSH_SH_H_ID "$MirOS: src/bin/mksh/sh.h,v 1.129 2007/05/13 17:51:23 tg Exp $" | ||||
| #define MKSH_SH_H_ID "$MirOS: src/bin/mksh/sh.h,v 1.130 2007/05/13 18:33:29 tg Exp $" | ||||
| #define MKSH_VERSION "R29 2007/05/10" | ||||
|  | ||||
| #if HAVE_SYS_PARAM_H | ||||
| @@ -1386,7 +1386,7 @@ char *str_save(const char *, Area *); | ||||
| #define str_save(s,ap) (str_nsave((s), (s) ? strlen(s) : 0, (ap))) | ||||
| #endif | ||||
| char *str_nsave(const char *, int, Area *); | ||||
| int option(const char *); | ||||
| size_t option(const char *); | ||||
| char *getoptions(void); | ||||
| void change_flag(enum sh_flag, int, int); | ||||
| int parse_args(const char **, int, int *); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user