mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-16 04:27:04 +00:00
winebuild: Do not access memory below ESP when restoring thread contexts.
Based on a patch by John Reiser.
This commit is contained in:
parent
6bec132c7a
commit
44fbc018ed
|
@ -852,31 +852,48 @@ static void build_call_from_regs_x86(void)
|
||||||
|
|
||||||
/* Restore the context structure */
|
/* Restore the context structure */
|
||||||
|
|
||||||
output( "2:\tpushl 0x94(%%ecx)\n"); /* SegEs */
|
output( "2:\n" );
|
||||||
|
|
||||||
|
/* As soon as we have switched stacks the context structure could
|
||||||
|
* be invalid (when signal handlers are executed for example). Copy
|
||||||
|
* values on the target stack before changing ESP. */
|
||||||
|
|
||||||
|
output( "\tpushl 0xc8(%%ecx)\n" ); /* SegSs */
|
||||||
|
output( "\tpopl %%es\n" );
|
||||||
|
output( "\tmovl 0xc4(%%ecx),%%eax\n" ); /* Esp */
|
||||||
|
output( "\tleal -4*4(%%eax),%%eax\n" );
|
||||||
|
|
||||||
|
output( "\tmovl 0xc0(%%ecx),%%edx\n" ); /* EFlags */
|
||||||
|
output( "\t.byte 0x26\n\tmovl %%edx,3*4(%%eax)\n" );
|
||||||
|
output( "\tmovl 0xbc(%%ecx),%%edx\n" ); /* SegCs */
|
||||||
|
output( "\t.byte 0x26\n\tmovl %%edx,2*4(%%eax)\n" );
|
||||||
|
output( "\tmovl 0xb8(%%ecx),%%edx\n" ); /* Eip */
|
||||||
|
output( "\t.byte 0x26\n\tmovl %%edx,1*4(%%eax)\n" );
|
||||||
|
output( "\tmovl 0xb0(%%ecx),%%edx\n" ); /* Eax */
|
||||||
|
output( "\t.byte 0x26\n\tmovl %%edx,0*4(%%eax)\n" );
|
||||||
|
|
||||||
|
output( "\tpushl %%es\n" );
|
||||||
|
output( "\tpushl 0x98(%%ecx)\n" ); /* SegDs */
|
||||||
|
|
||||||
|
output(" \tpushl 0x94(%%ecx)\n" ); /* SegEs */
|
||||||
output( "\tpopl %%es\n" );
|
output( "\tpopl %%es\n" );
|
||||||
output( "\tpushl 0x90(%%ecx)\n"); /* SegFs */
|
output( "\tpushl 0x90(%%ecx)\n"); /* SegFs */
|
||||||
output( "\tpopl %%fs\n" );
|
output( "\tpopl %%fs\n" );
|
||||||
output( "\tpushl 0x8c(%%ecx)\n"); /* SegGs */
|
output( "\tpushl 0x8c(%%ecx)\n"); /* SegGs */
|
||||||
output( "\tpopl %%gs\n" );
|
output( "\tpopl %%gs\n" );
|
||||||
|
|
||||||
output( "\tmovl 0x9c(%%ecx),%%edi\n"); /* Edi */
|
output( "\tmovl 0x9c(%%ecx),%%edi\n" ); /* Edi */
|
||||||
output( "\tmovl 0xa0(%%ecx),%%esi\n"); /* Esi */
|
output( "\tmovl 0xa0(%%ecx),%%esi\n" ); /* Esi */
|
||||||
output( "\tmovl 0xa8(%%ecx),%%edx\n"); /* Edx */
|
output( "\tmovl 0xa4(%%ecx),%%ebx\n" ); /* Ebx */
|
||||||
output( "\tmovl 0xa4(%%ecx),%%ebx\n"); /* Ebx */
|
output( "\tmovl 0xa8(%%ecx),%%edx\n" ); /* Edx */
|
||||||
output( "\tmovl 0xb0(%%ecx),%%eax\n"); /* Eax */
|
output( "\tmovl 0xb4(%%ecx),%%ebp\n" ); /* Ebp */
|
||||||
output( "\tmovl 0xb4(%%ecx),%%ebp\n"); /* Ebp */
|
output( "\tmovl 0xac(%%ecx),%%ecx\n" ); /* Ecx */
|
||||||
|
|
||||||
output( "\tpushl 0xc8(%%ecx)\n"); /* SegSs */
|
|
||||||
output( "\tpopl %%ss\n" );
|
|
||||||
output( "\tmovl 0xc4(%%ecx),%%esp\n"); /* Esp */
|
|
||||||
|
|
||||||
output( "\tpushl 0xc0(%%ecx)\n"); /* EFlags */
|
|
||||||
output( "\tpushl 0xbc(%%ecx)\n"); /* SegCs */
|
|
||||||
output( "\tpushl 0xb8(%%ecx)\n"); /* Eip */
|
|
||||||
output( "\tpushl 0x98(%%ecx)\n"); /* SegDs */
|
|
||||||
output( "\tmovl 0xac(%%ecx),%%ecx\n"); /* Ecx */
|
|
||||||
|
|
||||||
output( "\tpopl %%ds\n" );
|
output( "\tpopl %%ds\n" );
|
||||||
|
output( "\tpopl %%ss\n" );
|
||||||
|
output( "\tmovl %%eax,%%esp\n" );
|
||||||
|
|
||||||
|
output( "\tpopl %%eax\n" );
|
||||||
output( "\tiret\n" );
|
output( "\tiret\n" );
|
||||||
output_cfi( ".cfi_endproc" );
|
output_cfi( ".cfi_endproc" );
|
||||||
output_function_size( "__wine_call_from_regs" );
|
output_function_size( "__wine_call_from_regs" );
|
||||||
|
|
Loading…
Reference in a new issue