mirror of
				git://git.code.sf.net/p/cdesktopenv/code
				synced 2025-03-09 15:50:02 +00:00 
			
		
		
		
	Correctly block invalid values for arrays of an enum type
This fixes part of https://github.com/ksh93/ksh/issues/87: Scalar arrays (-a) and associative arrays (-A) of a type created by 'enum' did not consistently block values not specified by the enum type, yielding corrupted results. An expansion of type "${array[@]}" yielded random numbers instead of values for associative arrays of a type created by 'enum'. This does not yet fix another problem: ${array[@]} does not yield all values for associative enum arrays. src/cmd/ksh93/bltins/enum.c: put_enum(): - Always throw an error if the value is not in the list of possible values for an enum type. Remove incorrect check for the NV_NOFREE flag. Whatever that was meant to accomplish, I've no idea. src/cmd/ksh93/sh/array.c: nv_arraysettype(): - Instead of sh_eval()ing a shell assignment, use nv_putval() directly. Also use the stack (see src/lib/libast/man/stk.3) instead of malloc to save the value; it's faster and will be auto-freed at some point. This shortens the function and makes it faster by not entering into a whole new shell context -- which also fixes another problem: the error message from put_enum() didn't cause the shell to exit for indexed enum arrays. src/cmd/ksh93/sh/name.c: nv_setlist(): - Apply a patch from David Korn that correctly sets the data type for associative arrays, fixing the ${array[@]} expansion yielding random numbers. Thanks to @JohnoKing for the pointer. https://github.com/ksh93/ksh/issues/87#issuecomment-662613887 https://www.mail-archive.com/ast-developers@lists.research.att.com/msg00697.html src/cmd/ksh93/tests/enum.sh: - Add tests checking that invalid values are correctly blocked for indexed and associative arrays of an enum type. Makes progress on: https://github.com/ksh93/ksh/issues/87
This commit is contained in:
		
							parent
							
								
									6a0e9a1a75
								
							
						
					
					
						commit
						5491fe9724
					
				
					 6 changed files with 30 additions and 23 deletions
				
			
		|  | @ -407,11 +407,7 @@ static Namval_t *array_find(Namval_t *np,Namarr_t *arp, int flag) | |||
| int nv_arraysettype(Namval_t *np, Namval_t *tp, const char *sub, int flags) | ||||
| { | ||||
| 	Namval_t	*nq; | ||||
| 	char		*av[2]; | ||||
| 	int		rdonly = nv_isattr(np,NV_RDONLY); | ||||
| 	int		xtrace = sh_isoption(SH_XTRACE); | ||||
| 	Namarr_t	*ap = nv_arrayptr(np); | ||||
| 	av[1] = 0; | ||||
| 	sh.last_table = 0; | ||||
| 	if(!ap->table) | ||||
| 	{ | ||||
|  | @ -420,30 +416,20 @@ int nv_arraysettype(Namval_t *np, Namval_t *tp, const char *sub, int flags) | |||
| 	} | ||||
| 	if(nq = nv_search(sub, ap->table, NV_ADD)) | ||||
| 	{ | ||||
| 		char		*saved_value; | ||||
| 		int		rdonly = nv_isattr(np,NV_RDONLY); | ||||
| 		if(!nq->nvfun && nq->nvalue.cp && *nq->nvalue.cp==0) | ||||
| 			_nv_unset(nq,NV_RDONLY); | ||||
| 		nv_arraychild(np,nq,0); | ||||
| 		if(!nv_isattr(tp,NV_BINARY)) | ||||
| 		{ | ||||
| 			sfprintf(sh.strbuf,"%s=%s",nv_name(nq),nv_getval(np)); | ||||
| 			av[0] = strdup(sfstruse(sh.strbuf)); | ||||
| 		} | ||||
| 			saved_value = stkcopy(stkstd,nv_getval(np)); | ||||
| 		if(!nv_clone(tp,nq,flags|NV_NOFREE)) | ||||
| 			return(0); | ||||
| 		ap->nelem |= ARRAY_SCAN; | ||||
| 		if(!rdonly) | ||||
| 			nv_offattr(nq,NV_RDONLY); | ||||
| 		if(!nv_isattr(tp,NV_BINARY)) | ||||
| 		{ | ||||
| 			if(xtrace) | ||||
| 				sh_offoption(SH_XTRACE); | ||||
| 			ap->nelem &= ~ARRAY_SCAN; | ||||
| 			sh_eval(sh_sfeval(av),0); | ||||
| 			ap->nelem |= ARRAY_SCAN; | ||||
| 			free((void*)av[0]); | ||||
| 			if(xtrace) | ||||
| 				sh_onoption(SH_XTRACE); | ||||
| 		} | ||||
| 			nv_putval(nq,saved_value,0); | ||||
| 		ap->nelem |= ARRAY_SCAN; | ||||
| 		return(1); | ||||
| 	} | ||||
| 	return(0); | ||||
|  |  | |||
|  | @ -389,6 +389,8 @@ void nv_setlist(register struct argnod *arg,register int flags, Namval_t *typ) | |||
| 					if(array&NV_ARRAY) | ||||
| 					{ | ||||
| 						nv_setarray(np,nv_associative); | ||||
| 						if(typ) | ||||
| 							nv_settype(np,typ,0); | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue