mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	vim-patch:9.0.1840: [security] use-after-free in do_ecmd
Problem: use-after-free in do_ecmd Solution: Verify oldwin pointer after reset_VIsual()e1dc9a6275N/A patches for version.c: vim-patch:9.0.1841: style: trailing whitespace in ex_cmds.c Co-authored-by: Christian Brabandt <cb@256bit.org> (cherry picked from commit2ffd8d98fa)
This commit is contained in:
		 zeertzjq
					zeertzjq
				
			
				
					committed by
					
						![github-actions[bot]](/assets/img/avatar_default.png) github-actions[bot]
						github-actions[bot]
					
				
			
			
				
	
			
			
			![github-actions[bot]](/assets/img/avatar_default.png) github-actions[bot]
						github-actions[bot]
					
				
			
						parent
						
							c23bff6603
						
					
				
				
					commit
					ed626d2f8f
				
			| @@ -2202,8 +2202,16 @@ int do_ecmd(int fnum, char *ffname, char *sfname, exarg_T *eap, linenr_T newlnum | ||||
|  | ||||
|   // End Visual mode before switching to another buffer, so the text can be | ||||
|   // copied into the GUI selection buffer. | ||||
|   // Careful: may trigger ModeChanged() autocommand | ||||
|  | ||||
|   // Should we block autocommands here? | ||||
|   reset_VIsual(); | ||||
|  | ||||
|   // autocommands freed window :( | ||||
|   if (oldwin != NULL && !win_valid(oldwin)) { | ||||
|     oldwin = NULL; | ||||
|   } | ||||
|  | ||||
|   if ((command != NULL || newlnum > (linenr_T)0) | ||||
|       && *get_vim_var_str(VV_SWAPCOMMAND) == NUL) { | ||||
|     // Set v:swapcommand for the SwapExists autocommands. | ||||
|   | ||||
							
								
								
									
										16
									
								
								test/functional/legacy/crash_spec.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								test/functional/legacy/crash_spec.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| local helpers = require('test.functional.helpers')(after_each) | ||||
| local assert_alive = helpers.assert_alive | ||||
| local clear = helpers.clear | ||||
| local command = helpers.command | ||||
| local feed = helpers.feed | ||||
|  | ||||
| before_each(clear) | ||||
|  | ||||
| -- oldtest: Test_crash1() | ||||
| it('no crash when ending Visual mode while editing buffer closes window', function() | ||||
|   command('new') | ||||
|   command('autocmd ModeChanged v:n ++once close') | ||||
|   feed('v') | ||||
|   command('enew') | ||||
|   assert_alive() | ||||
| end) | ||||
							
								
								
									
										25
									
								
								test/old/testdir/test_crash.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								test/old/testdir/test_crash.vim
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| " Some tests, that used to crash Vim | ||||
| source check.vim | ||||
| source screendump.vim | ||||
|  | ||||
| CheckScreendump | ||||
|  | ||||
| func Test_crash1() | ||||
|   " The following used to crash Vim | ||||
|   let opts = #{wait_for_ruler: 0} | ||||
|   let args = ' -u NONE -i NONE -n -e -s -S ' | ||||
|   let buf = RunVimInTerminal(args .. ' crash/poc_huaf1', opts) | ||||
|   call VerifyScreenDump(buf, 'Test_crash_01', {}) | ||||
|   exe buf .. "bw!" | ||||
|  | ||||
|   let buf = RunVimInTerminal(args .. ' crash/poc_huaf2', opts) | ||||
|   call VerifyScreenDump(buf, 'Test_crash_01', {}) | ||||
|   exe buf .. "bw!" | ||||
|  | ||||
|   let buf = RunVimInTerminal(args .. ' crash/poc_huaf3', opts) | ||||
|   call VerifyScreenDump(buf, 'Test_crash_01', {}) | ||||
|   exe buf .. "bw!" | ||||
|  | ||||
| endfunc | ||||
|  | ||||
| " vim: shiftwidth=2 sts=2 expandtab | ||||
		Reference in New Issue
	
	Block a user