autload.cc: Avoid clobbering return address in noload on i686

This fixes a long-standing problem when GetProcAddress fails
	to load a function.  The noload code calls SetLastError on
	i686 without saving the edx register.  Starting with Windows 7,
	SetLastError apparently uses $edx and the register is set to
	0x00000000 on return.  So the subsequent `jmp *$edx' in noload
	supposed to return to the caller, actually jumps to address NULL,
	which results in a SEGV.

        * autoload.cc (noload): i686 only: Save and restore $edx when calling
        SetLastError to avoid clobbering return address stating with Windows 7.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2015-08-25 22:15:22 +02:00
parent 70b02101ca
commit 859c10beee
2 changed files with 9 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2015-08-25 Corinna Vinschen <corinna@vinschen.de>
* autoload.cc (noload): i686 only: Save and restore $edx when calling
SetLastError to avoid clobbering return address stating with Windows 7.
2015-08-25 Corinna Vinschen <corinna@vinschen.de> 2015-08-25 Corinna Vinschen <corinna@vinschen.de>
* mmap.cc: Fix a few comments. * mmap.cc: Fix a few comments.

View File

@ -254,11 +254,13 @@ noload: \n\
addl %eax,%esp # Pop off bytes \n\ addl %eax,%esp # Pop off bytes \n\
andl $0xffff0000,%eax# upper word \n\ andl $0xffff0000,%eax# upper word \n\
subl %eax,%esp # adjust for possible return value \n\ subl %eax,%esp # adjust for possible return value \n\
pushl %eax # Save for later \n\ pushl %eax # Save return value for later \n\
pushl %edx # Save return address for later \n\
movl $127,%eax # ERROR_PROC_NOT_FOUND \n\ movl $127,%eax # ERROR_PROC_NOT_FOUND \n\
pushl %eax # First argument \n\ pushl %eax # First argument \n\
call _SetLastError@4 # Set it \n\ call _SetLastError@4 # Set it \n\
popl %eax # Get back argument \n\ popl %edx # Get back return address \n\
popl %eax # Get back return value \n\
sarl $16,%eax # return value in high order word \n\ sarl $16,%eax # return value in high order word \n\
jmp *%edx # Return \n\ jmp *%edx # Return \n\
1: \n\ 1: \n\