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>
|
2015-08-25 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* mmap.cc: Fix a few comments.
|
* mmap.cc: Fix a few comments.
|
||||||
|
|
|
@ -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\
|
||||||
|
|
Loading…
Reference in New Issue