• save/restore here document pointer during yyrecursive(), fixes crash
• add mirbsd/openbsd (omalloc rules!) specific testcase for the above • $__progname must be used quoted, fix in comsub-torture testcase (my bad)
This commit is contained in:
		
							
								
								
									
										20
									
								
								check.t
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								check.t
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| # $MirOS: src/bin/mksh/check.t,v 1.430 2011/03/17 22:09:20 tg Exp $ | # $MirOS: src/bin/mksh/check.t,v 1.431 2011/03/21 21:57:32 tg Exp $ | ||||||
| # $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $ | # $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $ | ||||||
| # $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $ | # $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $ | ||||||
| # $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $ | # $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $ | ||||||
| @@ -25,7 +25,7 @@ | |||||||
| # http://www.research.att.com/~gsf/public/ifs.sh | # http://www.research.att.com/~gsf/public/ifs.sh | ||||||
|  |  | ||||||
| expected-stdout: | expected-stdout: | ||||||
| 	@(#)MIRBSD KSH R39 2011/03/17 | 	@(#)MIRBSD KSH R39 2011/03/21 | ||||||
| description: | description: | ||||||
| 	Check version of shell. | 	Check version of shell. | ||||||
| stdin: | stdin: | ||||||
| @@ -7040,13 +7040,13 @@ stdin: | |||||||
| 		if (( lastf )); then | 		if (( lastf )); then | ||||||
| 			x="inline_${nextf}() {"$fbody$'\n}\n' | 			x="inline_${nextf}() {"$fbody$'\n}\n' | ||||||
| 			print -nr -- "$x" | 			print -nr -- "$x" | ||||||
| 			print -r -- "${x}typeset -f inline_$nextf" | $__progname | 			print -r -- "${x}typeset -f inline_$nextf" | "$__progname" | ||||||
| 			x="function comsub_$nextf { x=\$("$fbody$'\n); }\n' | 			x="function comsub_$nextf { x=\$("$fbody$'\n); }\n' | ||||||
| 			print -nr -- "$x" | 			print -nr -- "$x" | ||||||
| 			print -r -- "${x}typeset -f comsub_$nextf" | $__progname | 			print -r -- "${x}typeset -f comsub_$nextf" | "$__progname" | ||||||
| 			x="function reread_$nextf { x=\$(("$fbody$'\n)|tr u x); }\n' | 			x="function reread_$nextf { x=\$(("$fbody$'\n)|tr u x); }\n' | ||||||
| 			print -nr -- "$x" | 			print -nr -- "$x" | ||||||
| 			print -r -- "${x}typeset -f reread_$nextf" | $__progname | 			print -r -- "${x}typeset -f reread_$nextf" | "$__progname" | ||||||
| 		fi | 		fi | ||||||
| 		lastf=1 | 		lastf=1 | ||||||
| 		fbody= | 		fbody= | ||||||
| @@ -8384,3 +8384,13 @@ expected-stdout: | |||||||
| 	24 ?lnnix/nix =lnnix/nix: No such file or directory !2 | 	24 ?lnnix/nix =lnnix/nix: No such file or directory !2 | ||||||
| 	25 ?lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself =lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself: Too many levels of symbolic links !62 | 	25 ?lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself =lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself: Too many levels of symbolic links !62 | ||||||
| --- | --- | ||||||
|  | name: crash-1 | ||||||
|  | description: | ||||||
|  | 	Crashed during March 2011, fixed on vernal equinōx ☺ | ||||||
|  | category: os:mirbsd,os:openbsd | ||||||
|  | stdin: | ||||||
|  | 	export MALLOC_OPTIONS=FGJPRSX | ||||||
|  | 	"$__progname" -c 'x=$(tr z r <<<baz); echo $x' | ||||||
|  | expected-stdout: | ||||||
|  | 	bar | ||||||
|  | --- | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								sh.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								sh.h
									
									
									
									
									
								
							| @@ -154,9 +154,9 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef EXTERN | #ifdef EXTERN | ||||||
| __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.449 2011/03/17 22:09:23 tg Exp $"); | __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.450 2011/03/21 21:57:33 tg Exp $"); | ||||||
| #endif | #endif | ||||||
| #define MKSH_VERSION "R39 2011/03/17" | #define MKSH_VERSION "R39 2011/03/21" | ||||||
|  |  | ||||||
| #ifndef MKSH_INCLUDES_ONLY | #ifndef MKSH_INCLUDES_ONLY | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								syn.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								syn.c
									
									
									
									
									
								
							| @@ -22,7 +22,7 @@ | |||||||
|  |  | ||||||
| #include "sh.h" | #include "sh.h" | ||||||
|  |  | ||||||
| __RCSID("$MirOS: src/bin/mksh/syn.c,v 1.57 2011/03/13 16:03:54 tg Exp $"); | __RCSID("$MirOS: src/bin/mksh/syn.c,v 1.58 2011/03/21 21:57:35 tg Exp $"); | ||||||
|  |  | ||||||
| struct nesting_state { | struct nesting_state { | ||||||
| 	int start_token;	/* token than began nesting (eg, FOR) */ | 	int start_token;	/* token than began nesting (eg, FOR) */ | ||||||
| @@ -1097,6 +1097,7 @@ yyrecursive(void) | |||||||
| 	char *cp; | 	char *cp; | ||||||
| 	bool old_reject; | 	bool old_reject; | ||||||
| 	int old_symbol; | 	int old_symbol; | ||||||
|  | 	struct ioword **old_herep; | ||||||
| 	extern short comsub_nesting_level; | 	extern short comsub_nesting_level; | ||||||
|  |  | ||||||
| 	/* tell the lexer to accept a closing parenthesis as EOD */ | 	/* tell the lexer to accept a closing parenthesis as EOD */ | ||||||
| @@ -1106,8 +1107,10 @@ yyrecursive(void) | |||||||
| 	old_reject = reject; | 	old_reject = reject; | ||||||
| 	old_symbol = symbol; | 	old_symbol = symbol; | ||||||
| 	ACCEPT; | 	ACCEPT; | ||||||
|  | 	old_herep = herep; | ||||||
| 	/* we use TPAREN as a helper container here */ | 	/* we use TPAREN as a helper container here */ | ||||||
| 	t = nested(TPAREN, '(', ')'); | 	t = nested(TPAREN, '(', ')'); | ||||||
|  | 	herep = old_herep; | ||||||
| 	reject = old_reject; | 	reject = old_reject; | ||||||
| 	symbol = old_symbol; | 	symbol = old_symbol; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user