diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-17 18:47:09 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-17 18:47:09 +0200 |
| commit | 59fe5f3572f1e4cc371f030c111aa3071c9d2480 (patch) | |
| tree | ec4a6ec6c345cefdf20df5a4df6bf2fb24c3a0f2 /src/libtools | |
| parent | 18320e19bc0a7f4cfd99c29088395021ceee0051 (diff) | |
| download | box64-59fe5f3572f1e4cc371f030c111aa3071c9d2480.tar.gz box64-59fe5f3572f1e4cc371f030c111aa3071c9d2480.zip | |
Fixed handling of * in scnaf/printf Stack argument handling
Diffstat (limited to 'src/libtools')
| -rwxr-xr-x | src/libtools/myalign.c | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/src/libtools/myalign.c b/src/libtools/myalign.c index 1d2f3d11..a61728c5 100755 --- a/src/libtools/myalign.c +++ b/src/libtools/myalign.c @@ -79,7 +79,16 @@ void myStackAlign(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mystac case 'S': case 's': state = 30; break; // pointers case '$': ++p; break; // should issue a warning, it's not handled... - case '*': *(mystack++) = *(st++); ++p; break; // fetch an int in the stack.... + case '*': + if(pos<6) + *mystack = emu->regs[regs_abi[pos++]].q[0]; + else { + *mystack = *st; + ++st; + } + ++mystack; + ++p; + break; // fetch an int in the stack.... case ' ': state=0; ++p; break; default: state=20; // other stuff, put an int... @@ -150,10 +159,12 @@ void myStackAlignScanf(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* m // loop... const char* p = fmt; int state = 0; + int ign = 0; while(*p) { switch(state) { case 0: + ign = 0; switch(*p) { case '%': state = 1; ++p; break; default: @@ -203,7 +214,7 @@ void myStackAlignScanf(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* m case 'S': case 's': state = 30; break; // pointers case '$': ++p; break; // should issue a warning, it's not handled... - case '*': *(mystack++) = *(st++); ++p; break; // fetch an int in the stack.... + case '*': ign=1; ++p; break; // ignore arg case ' ': state=0; ++p; break; default: state=20; // other stuff, put an int... @@ -219,13 +230,15 @@ void myStackAlignScanf(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* m case 23: // 64bits int case 24: // normal int / pointer case 30: - if(pos<6) - *mystack = emu->regs[regs_abi[pos++]].q[0]; - else { - *mystack = *st; - ++st; + if(!ign) { + if(pos<6) + *mystack = emu->regs[regs_abi[pos++]].q[0]; + else { + *mystack = *st; + ++st; + } + ++mystack; } - ++mystack; state = 0; ++p; break; @@ -299,7 +312,16 @@ void myStackAlignW(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mysta case 'S': case 's': state = 30; break; // pointers case '$': ++p; break; // should issue a warning, it's not handled... - case '*': *(mystack++) = *(st++); ++p; break; // fetch an int in the stack.... + case '*': + if(pos<6) + *mystack = emu->regs[regs_abi[pos++]].q[0]; + else { + *mystack = *st; + ++st; + } + ++mystack; + ++p; + break; // fetch an int in the stack.... case ' ': state=0; ++p; break; default: state=20; // other stuff, put an int... @@ -370,10 +392,12 @@ void myStackAlignScanfW(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* // loop... const wchar_t* p = (const wchar_t*)fmt; int state = 0; + int ign = 0; while(*p) { switch(state) { case 0: + ign = 0; switch(*p) { case '%': state = 1; ++p; break; default: @@ -423,7 +447,7 @@ void myStackAlignScanfW(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* case 'S': case 's': state = 30; break; // pointers case '$': ++p; break; // should issue a warning, it's not handled... - case '*': *(mystack++) = *(st++); ++p; break; // fetch an int in the stack.... + case '*': ign = 1; ++p; break; // ignore arg case ' ': state=0; ++p; break; default: state=20; // other stuff, put an int... @@ -439,13 +463,15 @@ void myStackAlignScanfW(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* case 23: // 64bits int case 24: // normal int / pointer case 30: - if(pos<6) - *mystack = emu->regs[regs_abi[pos++]].q[0]; - else { - *mystack = *st; - ++st; + if(!ign) { + if(pos<6) + *mystack = emu->regs[regs_abi[pos++]].q[0]; + else { + *mystack = *st; + ++st; + } + ++mystack; } - ++mystack; state = 0; ++p; break; |