Module: wine Branch: master Commit: 9edcd1c1b24b9b857a95f2e0e772cfae7a5470b3 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=9edcd1c1b24b9b857a95f2e0...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Aug 18 20:56:43 2006 +0200
msvcrt: Fixed access to the extra arguments of setjmp3.
---
dlls/msvcrt/except.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/dlls/msvcrt/except.c b/dlls/msvcrt/except.c index d8691a8..75b7799 100644 --- a/dlls/msvcrt/except.c +++ b/dlls/msvcrt/except.c @@ -315,7 +315,7 @@ int CDECL __regs_MSVCRT__setjmp(struct M * _setjmp3 (MSVCRT.@) */ DEFINE_SETJMP_ENTRYPOINT( MSVCRT__setjmp3 ); -int CDECL __regs_MSVCRT__setjmp3(struct MSVCRT___JUMP_BUFFER *jmp, int nb_args) +int CDECL __regs_MSVCRT__setjmp3(struct MSVCRT___JUMP_BUFFER *jmp, int nb_args, ...) { jmp->Cookie = MSVCRT_JMP_MAGIC; jmp->UnwindFunc = 0; @@ -326,16 +326,16 @@ int CDECL __regs_MSVCRT__setjmp3(struct } else { - void **args = ((void**)jmp->Esp)+2; + int i; + va_list args;
- if (nb_args > 0) jmp->UnwindFunc = (unsigned long)*args++; - if (nb_args > 1) jmp->TryLevel = (unsigned long)*args++; + va_start( args, nb_args ); + if (nb_args > 0) jmp->UnwindFunc = va_arg( args, unsigned long ); + if (nb_args > 1) jmp->TryLevel = va_arg( args, unsigned long ); else jmp->TryLevel = ((MSVCRT_EXCEPTION_FRAME*)jmp->Registration)->trylevel; - if (nb_args > 2) - { - size_t size = (nb_args - 2) * sizeof(DWORD); - memcpy( jmp->UnwindData, args, min( size, sizeof(jmp->UnwindData) )); - } + for (i = 0; i < 6 && i < nb_args - 2; i++) + jmp->UnwindData[i] = va_arg( args, unsigned long ); + va_end( args ); }
TRACE("buf=%p ebx=%08lx esi=%08lx edi=%08lx ebp=%08lx esp=%08lx eip=%08lx frame=%08lx\n",