Skip to content

Commit be199c5

Browse files
committed
Prevent inifinte redirection when alt is used to redirect an x64 function, like mallochook does (alternative to #3707)
1 parent 8dde29f commit be199c5

10 files changed

Lines changed: 221 additions & 51 deletions

File tree

src/dynarec/dynarec.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2, uintptr_t* x3)
106106
}
107107
#endif
108108

109-
void DynaCall(x64emu_t* emu, uintptr_t addr)
109+
void DynaCall(x64emu_t* emu, uintptr_t addr, int no_alt)
110110
{
111111
uint64_t old_rsp = R_RSP;
112112
uint64_t old_rbx = R_RBX;
@@ -131,7 +131,7 @@ void DynaCall(x64emu_t* emu, uintptr_t addr)
131131
emu->df = d_none;
132132
if(emu->flags.quitonlongjmp)
133133
emu->flags.need_jmpbuf = 1;
134-
EmuRun(emu, 1);
134+
EmuRun(emu, 1, no_alt);
135135
emu->quit = 0; // reset Quit flags...
136136
emu->df = d_none;
137137
if(emu->flags.quitonlongjmp && emu->flags.longjmp) {
@@ -164,7 +164,7 @@ static dynablock_t* fastDBGetBlock(x64emu_t* emu, uintptr_t addr, int create, in
164164
}
165165
#endif
166166

167-
void EmuRun(x64emu_t* emu, int use_dynarec)
167+
void EmuRun(x64emu_t* emu, int use_dynarec, int no_alt)
168168
{
169169
// prepare setjump for signal handling
170170
JUMPBUFF jmpbuf[1] = {0};
@@ -201,7 +201,10 @@ void EmuRun(x64emu_t* emu, int use_dynarec)
201201
}
202202
if(emu->flags.need_jmpbuf)
203203
emu->flags.need_jmpbuf = 0;
204-
R_RIP = (uintptr_t)getAlternate((void*)R_RIP);
204+
if(no_alt)
205+
no_alt = 0;
206+
else
207+
R_RIP = (uintptr_t)getAlternate((void*)R_RIP);
205208
#ifdef DYNAREC
206209
if(!BOX64ENV(dynarec) || !use_dynarec)
207210
#endif
@@ -278,5 +281,5 @@ void EmuRun(x64emu_t* emu, int use_dynarec)
278281

279282
void DynaRun(x64emu_t *emu)
280283
{
281-
EmuRun(emu, 1);
284+
EmuRun(emu, 1, 0);
282285
}

src/emu/x64emu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ void EmuCall(x64emu_t* emu, uintptr_t addr)
582582
emu->df = d_none;
583583
if(emu->flags.quitonlongjmp)
584584
emu->flags.need_jmpbuf = 1;
585-
EmuRun(emu, 0);
585+
EmuRun(emu, 0, 0);
586586
emu->quit = 0; // reset Quit flags...
587587
emu->df = d_none;
588588
if(emu->flags.quitonlongjmp && emu->flags.longjmp) {

src/include/box64cpu.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
typedef struct x64emu_s x64emu_t;
55

66
int Run(x64emu_t *emu, int step);
7-
void EmuRun(x64emu_t* emu, int use_dynarec);
7+
void EmuRun(x64emu_t* emu, int use_dynarec, int no_alt);
88
void EmuCall(x64emu_t* emu, uintptr_t addr);
99
void StopEmu(x64emu_t* emu, const char* reason, int is32bits);
1010
void DynaRun(x64emu_t *emu);
11-
void DynaCall(x64emu_t* emu, uintptr_t addr);
11+
void DynaCall(x64emu_t* emu, uintptr_t addr, int no_alt);
1212

1313
#endif // __BOX64CPU_H_

src/include/callback.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ typedef struct x64emu_s x64emu_t;
77

88
uint64_t RunFunction(uintptr_t fnc, int nargs, ...);
99
uint64_t RunFunctionFmt(uintptr_t fnc, const char* fmt, ...);
10+
uint64_t RunFunctionFmtNoAlt(uintptr_t fnc, const char* fmt, ...);
1011
double RunFunctionFmtD(uintptr_t fnc, const char* fmt, ...);
1112
// save all modified register
1213
uint64_t RunSafeFunction(uintptr_t fnc, int nargs, ...);

src/libtools/signal32.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ uint32_t RunFunctionHandler32(int* exit, int dynarec, i386_ucontext_t* sigcontex
401401
R_CS = 0x23;
402402

403403
if(dynarec)
404-
DynaCall(emu, fnc);
404+
DynaCall(emu, fnc, 0);
405405
else
406406
EmuCall(emu, fnc);
407407

src/libtools/signals.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ uint64_t RunFunctionHandler(x64emu_t* emu, int* exit, int dynarec, x64_ucontext_
133133
R_CS = 0x33;
134134

135135
if(dynarec)
136-
DynaCall(emu, fnc);
136+
DynaCall(emu, fnc, 0);
137137
else
138138
EmuCall(emu, fnc);
139139

src/libtools/threads.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,7 @@ int EXPORT my_pthread_once(x64emu_t* emu, int* once, void* cb)
784784
R_RBP = R_RSP; // mov rbp, rsp
785785
R_RSP &= ~63LL;
786786

787-
DynaCall(emu, (uintptr_t)cb); // using DynaCall, speedup wine 7.21 initialisation
787+
DynaCall(emu, (uintptr_t)cb, 0); // using DynaCall, speedup wine 7.21 initialisation
788788

789789
R_RSP = R_RBP; // mov rsp, rbp
790790
R_RBP = Pop64(emu); // pop rbp

src/libtools/threads32.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ int EXPORT my32_pthread_once(x64emu_t* emu, int* once, void* cb)
436436
R_EBP = R_ESP; // mov rbp, rsp
437437
R_ESP -= 0x200;
438438
R_ESP &= ~63LL;
439-
DynaCall(emu, (uintptr_t)cb);
439+
DynaCall(emu, (uintptr_t)cb, 0);
440440
R_ESP = R_EBP; // mov rsp, rbp
441441
R_EBP = Pop32(emu); // pop rbp
442442
*once = 1;

0 commit comments

Comments
 (0)