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:
parent
70b02101ca
commit
859c10beee
|
@ -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>
|
||||
|
||||
* mmap.cc: Fix a few comments.
|
||||
|
|
|
@ -254,11 +254,13 @@ noload: \n\
|
|||
addl %eax,%esp # Pop off bytes \n\
|
||||
andl $0xffff0000,%eax# upper word \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\
|
||||
pushl %eax # First argument \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\
|
||||
jmp *%edx # Return \n\
|
||||
1: \n\
|
||||
|
|
Loading…
Reference in New Issue