diff options
| author | rajdakin <rajdakin@gmail.com> | 2024-09-08 15:10:45 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-08 15:10:45 +0200 |
| commit | 2e04ff93cabdbdcef060ce5e40f544f4dd6f93bb (patch) | |
| tree | fcad53d794d67dc87eb19d75827240cd0a8ba407 | |
| parent | a9f96b9d622a8d8462957d9d42b05d3574f6ba75 (diff) | |
| download | box64-2e04ff93cabdbdcef060ce5e40f544f4dd6f93bb.tar.gz box64-2e04ff93cabdbdcef060ce5e40f544f4dd6f93bb.zip | |
[WRAPPED] Fixed some libc wrapped functions (#1806)
* [WRAPPED] Fixed some libc wrapped functions * [WRAPPED] Fixed static build, added back * [WRAPPED] Fixed unlimited wrapping * [WRAPPED] Forgot to update
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 15 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedlibctypes.h | 9 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 13 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 6 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibc.c | 101 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibc_private.h | 24 |
6 files changed, 126 insertions, 42 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index 8360d2cf..6f226189 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -394,7 +394,6 @@ #() vFipu #() vFipL #() vFipp -#() vFipA #() vFCCC #() vFWWW #() vFucc @@ -1872,6 +1871,7 @@ #() vFiiiuil #() vFiiilpi #() vFiiuilp +#() vFiipupV #() vFiffiff #() vFiddidd #() vFilipli @@ -3143,15 +3143,15 @@ #!defined(NOALIGN) iFEiiip #!defined(NOALIGN) iFEipii #!defined(NOALIGN) iFEipiip -#!defined(STATICBUILD) lFiV +#!defined(STATICBUILD) lFiN #!defined(STATICBUILD) iFlip #!defined(STATICBUILD) iFLLi #!defined(STATICBUILD) iFLLii #!defined(STATICBUILD) WFpLLu -#!defined(STATICBUILD) lFpLpV #!defined(STATICBUILD) iFEipup #!defined(STATICBUILD) iFEiipup #!defined(STATICBUILD) iFpipppL +#!defined(STATICBUILD) lFpLpdddddd #() vFEv -> vFE #() iFEv -> iFE #() lFEv -> lFE @@ -4230,12 +4230,15 @@ wrappedlibc: - execle - execlp - printf + - scanf - wprintf + - wscanf - iFpA: - __isoc99_vscanf - vprintf - vscanf - vwprintf + - vwscanf - iFSp: - _IO_file_stat - pFip: @@ -4257,6 +4260,8 @@ wrappedlibc: - errx - syslog - vFipA: + - verr + - verrx - vsyslog - vFpii: - backtrace_symbols_fd @@ -4326,6 +4331,7 @@ wrappedlibc: - vfprintf - vfscanf - vfwprintf + - vfwscanf - lFipV: - __wprintf_chk - lFppL: @@ -4344,6 +4350,7 @@ wrappedlibc: - fopencookie - vFiipV: - __syslog_chk + - error - vFiipA: - __vsyslog_chk - vFpLLp: @@ -4426,6 +4433,8 @@ wrappedlibc: - pFpppLp: - lfind - lsearch +- vFiipupV: + - error_at_line - iFpLiLpp: - __vsnprintf_chk - iFpLiLpV: diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h index 46c636db..1e5daf98 100644 --- a/src/wrapped/generated/wrappedlibctypes.h +++ b/src/wrapped/generated/wrappedlibctypes.h @@ -94,6 +94,7 @@ typedef int32_t (*iFpuppp_t)(void*, uint32_t, void*, void*, void*); typedef void* (*pFpLLiN_t)(void*, uintptr_t, uintptr_t, int32_t, ...); typedef void* (*pFppLLp_t)(void*, void*, uintptr_t, uintptr_t, void*); typedef void* (*pFpppLp_t)(void*, void*, void*, uintptr_t, void*); +typedef void (*vFiipupV_t)(int32_t, int32_t, void*, uint32_t, void*, ...); typedef int32_t (*iFpLiLpp_t)(void*, uintptr_t, int32_t, uintptr_t, void*, void*); typedef int32_t (*iFpLiLpV_t)(void*, uintptr_t, int32_t, uintptr_t, void*, ...); typedef int32_t (*iFpppppp_t)(void*, void*, void*, void*, void*, void*); @@ -161,11 +162,14 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void* GO(execle, iFpV_t) \ GO(execlp, iFpV_t) \ GO(printf, iFpV_t) \ + GO(scanf, iFpV_t) \ GO(wprintf, iFpV_t) \ + GO(wscanf, iFpV_t) \ GO(__isoc99_vscanf, iFpA_t) \ GO(vprintf, iFpA_t) \ GO(vscanf, iFpA_t) \ GO(vwprintf, iFpA_t) \ + GO(vwscanf, iFpA_t) \ GO(_IO_file_stat, iFSp_t) \ GO(__sysv_signal, pFip_t) \ GO(bsd_signal, pFip_t) \ @@ -180,6 +184,8 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void* GO(err, vFipV_t) \ GO(errx, vFipV_t) \ GO(syslog, vFipV_t) \ + GO(verr, vFipA_t) \ + GO(verrx, vFipA_t) \ GO(vsyslog, vFipA_t) \ GO(backtrace_symbols_fd, vFpii_t) \ GO(_ITM_addUserCommitAction, vFpup_t) \ @@ -234,6 +240,7 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void* GO(vfprintf, iFSpA_t) \ GO(vfscanf, iFSpA_t) \ GO(vfwprintf, iFSpA_t) \ + GO(vfwscanf, iFSpA_t) \ GO(__wprintf_chk, lFipV_t) \ GO(readlink, lFppL_t) \ GO(strlcat, LFppL_t) \ @@ -245,6 +252,7 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void* GO(tsearch, pFppp_t) \ GO(fopencookie, pFppV_t) \ GO(__syslog_chk, vFiipV_t) \ + GO(error, vFiipV_t) \ GO(__vsyslog_chk, vFiipA_t) \ GO(qsort, vFpLLp_t) \ GO(makecontext, vFppiV_t) \ @@ -294,6 +302,7 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void* GO(bsearch, pFppLLp_t) \ GO(lfind, pFpppLp_t) \ GO(lsearch, pFpppLp_t) \ + GO(error_at_line, vFiipupV_t) \ GO(__vsnprintf_chk, iFpLiLpp_t) \ GO(__snprintf_chk, iFpLiLpV_t) \ GO(__swprintf_chk, iFpLiLpV_t) \ diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index d8af18f1..96186f9d 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -430,7 +430,6 @@ typedef void (*vFipi_t)(int32_t, void*, int32_t); typedef void (*vFipu_t)(int32_t, void*, uint32_t); typedef void (*vFipL_t)(int32_t, void*, uintptr_t); typedef void (*vFipp_t)(int32_t, void*, void*); -typedef void (*vFipA_t)(int32_t, void*, void*); typedef void (*vFCCC_t)(uint8_t, uint8_t, uint8_t); typedef void (*vFWWW_t)(uint16_t, uint16_t, uint16_t); typedef void (*vFucc_t)(uint32_t, int8_t, int8_t); @@ -1901,6 +1900,7 @@ typedef void (*vFiiiiii_t)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) typedef void (*vFiiiuil_t)(int32_t, int32_t, int32_t, uint32_t, int32_t, intptr_t); typedef void (*vFiiilpi_t)(int32_t, int32_t, int32_t, intptr_t, void*, int32_t); typedef void (*vFiiuilp_t)(int32_t, int32_t, uint32_t, int32_t, intptr_t, void*); +typedef void (*vFiipupV_t)(int32_t, int32_t, void*, uint32_t, void*, void*); typedef void (*vFiffiff_t)(int32_t, float, float, int32_t, float, float); typedef void (*vFiddidd_t)(int32_t, double, double, int32_t, double, double); typedef void (*vFilipli_t)(int32_t, intptr_t, int32_t, void*, intptr_t, int32_t); @@ -3230,15 +3230,15 @@ typedef int32_t (*iFEipiip_t)(x64emu_t*, int32_t, void*, int32_t, int32_t, void* #endif #if !defined(STATICBUILD) -typedef intptr_t (*lFiV_t)(int32_t, void*); +typedef intptr_t (*lFiN_t)(int32_t, ...); typedef int32_t (*iFlip_t)(intptr_t, int32_t, void*); typedef int32_t (*iFLLi_t)(uintptr_t, uintptr_t, int32_t); typedef int32_t (*iFLLii_t)(uintptr_t, uintptr_t, int32_t, int32_t); typedef uint16_t (*WFpLLu_t)(void*, uintptr_t, uintptr_t, uint32_t); -typedef intptr_t (*lFpLpV_t)(void*, uintptr_t, void*, void*); typedef int32_t (*iFEipup_t)(x64emu_t*, int32_t, void*, uint32_t, void*); typedef int32_t (*iFEiipup_t)(x64emu_t*, int32_t, int32_t, void*, uint32_t, void*); typedef int32_t (*iFpipppL_t)(void*, int32_t, void*, void*, void*, uintptr_t); +typedef intptr_t (*lFpLpdddddd_t)(void*, uintptr_t, void*, double, double, double, double, double, double); #endif void vFE(x64emu_t *emu, uintptr_t fcn) { vFE_t fn = (vFE_t)fcn; fn(emu); } @@ -3622,7 +3622,6 @@ void vFipi(x64emu_t *emu, uintptr_t fcn) { vFipi_t fn = (vFipi_t)fcn; fn((int32_ void vFipu(x64emu_t *emu, uintptr_t fcn) { vFipu_t fn = (vFipu_t)fcn; fn((int32_t)R_RDI, (void*)R_RSI, (uint32_t)R_RDX); } void vFipL(x64emu_t *emu, uintptr_t fcn) { vFipL_t fn = (vFipL_t)fcn; fn((int32_t)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX); } void vFipp(x64emu_t *emu, uintptr_t fcn) { vFipp_t fn = (vFipp_t)fcn; fn((int32_t)R_RDI, (void*)R_RSI, (void*)R_RDX); } -void vFipA(x64emu_t *emu, uintptr_t fcn) { vFipA_t fn = (vFipA_t)fcn; fn((int32_t)R_RDI, (void*)R_RSI, (void*)R_RDX); } void vFCCC(x64emu_t *emu, uintptr_t fcn) { vFCCC_t fn = (vFCCC_t)fcn; fn((uint8_t)R_RDI, (uint8_t)R_RSI, (uint8_t)R_RDX); } void vFWWW(x64emu_t *emu, uintptr_t fcn) { vFWWW_t fn = (vFWWW_t)fcn; fn((uint16_t)R_RDI, (uint16_t)R_RSI, (uint16_t)R_RDX); } void vFucc(x64emu_t *emu, uintptr_t fcn) { vFucc_t fn = (vFucc_t)fcn; fn((uint32_t)R_RDI, (int8_t)R_RSI, (int8_t)R_RDX); } @@ -5093,6 +5092,7 @@ void vFiiiiii(x64emu_t *emu, uintptr_t fcn) { vFiiiiii_t fn = (vFiiiiii_t)fcn; f void vFiiiuil(x64emu_t *emu, uintptr_t fcn) { vFiiiuil_t fn = (vFiiiuil_t)fcn; fn((int32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (uint32_t)R_RCX, (int32_t)R_R8, (intptr_t)R_R9); } void vFiiilpi(x64emu_t *emu, uintptr_t fcn) { vFiiilpi_t fn = (vFiiilpi_t)fcn; fn((int32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (intptr_t)R_RCX, (void*)R_R8, (int32_t)R_R9); } void vFiiuilp(x64emu_t *emu, uintptr_t fcn) { vFiiuilp_t fn = (vFiiuilp_t)fcn; fn((int32_t)R_RDI, (int32_t)R_RSI, (uint32_t)R_RDX, (int32_t)R_RCX, (intptr_t)R_R8, (void*)R_R9); } +void vFiipupV(x64emu_t *emu, uintptr_t fcn) { vFiipupV_t fn = (vFiipupV_t)fcn; fn((int32_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (uint32_t)R_RCX, (void*)R_R8, (void*)(R_RSP + 8)); } void vFiffiff(x64emu_t *emu, uintptr_t fcn) { vFiffiff_t fn = (vFiffiff_t)fcn; fn((int32_t)R_RDI, emu->xmm[0].f[0], emu->xmm[1].f[0], (int32_t)R_RSI, emu->xmm[2].f[0], emu->xmm[3].f[0]); } void vFiddidd(x64emu_t *emu, uintptr_t fcn) { vFiddidd_t fn = (vFiddidd_t)fcn; fn((int32_t)R_RDI, emu->xmm[0].d[0], emu->xmm[1].d[0], (int32_t)R_RSI, emu->xmm[2].d[0], emu->xmm[3].d[0]); } void vFilipli(x64emu_t *emu, uintptr_t fcn) { vFilipli_t fn = (vFilipli_t)fcn; fn((int32_t)R_RDI, (intptr_t)R_RSI, (int32_t)R_RDX, (void*)R_RCX, (intptr_t)R_R8, (int32_t)R_R9); } @@ -6422,15 +6422,15 @@ void iFEipiip(x64emu_t *emu, uintptr_t fcn) { iFEipiip_t fn = (iFEipiip_t)fcn; R #endif #if !defined(STATICBUILD) -void lFiV(x64emu_t *emu, uintptr_t fcn) { lFiV_t fn = (lFiV_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)(R_RSP + 8)); } +void lFiN(x64emu_t *emu, uintptr_t fcn) { lFiN_t fn = (lFiN_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI); } void iFlip(x64emu_t *emu, uintptr_t fcn) { iFlip_t fn = (iFlip_t)fcn; R_RAX=(int32_t)fn((intptr_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX); } void iFLLi(x64emu_t *emu, uintptr_t fcn) { iFLLi_t fn = (iFLLi_t)fcn; R_RAX=(int32_t)fn((uintptr_t)R_RDI, (uintptr_t)R_RSI, (int32_t)R_RDX); } void iFLLii(x64emu_t *emu, uintptr_t fcn) { iFLLii_t fn = (iFLLii_t)fcn; R_RAX=(int32_t)fn((uintptr_t)R_RDI, (uintptr_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX); } void WFpLLu(x64emu_t *emu, uintptr_t fcn) { WFpLLu_t fn = (WFpLLu_t)fcn; R_RAX=(unsigned short)fn((void*)R_RDI, (uintptr_t)R_RSI, (uintptr_t)R_RDX, (uint32_t)R_RCX); } -void lFpLpV(x64emu_t *emu, uintptr_t fcn) { lFpLpV_t fn = (lFpLpV_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (uintptr_t)R_RSI, (void*)R_RDX, (void*)(R_RSP + 8)); } void iFEipup(x64emu_t *emu, uintptr_t fcn) { iFEipup_t fn = (iFEipup_t)fcn; R_RAX=(int32_t)fn(emu, (int32_t)R_RDI, (void*)R_RSI, (uint32_t)R_RDX, (void*)R_RCX); } void iFEiipup(x64emu_t *emu, uintptr_t fcn) { iFEiipup_t fn = (iFEiipup_t)fcn; R_RAX=(int32_t)fn(emu, (int32_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (uint32_t)R_RCX, (void*)R_R8); } void iFpipppL(x64emu_t *emu, uintptr_t fcn) { iFpipppL_t fn = (iFpipppL_t)fcn; R_RAX=(int32_t)fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (uintptr_t)R_R9); } +void lFpLpdddddd(x64emu_t *emu, uintptr_t fcn) { lFpLpdddddd_t fn = (lFpLpdddddd_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (uintptr_t)R_RSI, (void*)R_RDX, emu->xmm[0].d[0], emu->xmm[1].d[0], emu->xmm[2].d[0], emu->xmm[3].d[0], emu->xmm[4].d[0], emu->xmm[5].d[0]); } #endif void vFEv(x64emu_t *emu, uintptr_t fcn) { vFE_t fn = (vFE_t)fcn; fn(emu); } @@ -8297,6 +8297,7 @@ int isSimpleWrapper(wrapper_t fun) { if (fun == &iFLLii) return 1; if (fun == &WFpLLu) return 1; if (fun == &iFpipppL) return 1; + if (fun == &lFpLpdddddd) return 7; #endif return 0; } diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index 8fef78c7..132d3b46 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -432,7 +432,6 @@ void vFipi(x64emu_t *emu, uintptr_t fnc); void vFipu(x64emu_t *emu, uintptr_t fnc); void vFipL(x64emu_t *emu, uintptr_t fnc); void vFipp(x64emu_t *emu, uintptr_t fnc); -void vFipA(x64emu_t *emu, uintptr_t fnc); void vFCCC(x64emu_t *emu, uintptr_t fnc); void vFWWW(x64emu_t *emu, uintptr_t fnc); void vFucc(x64emu_t *emu, uintptr_t fnc); @@ -1910,6 +1909,7 @@ void vFiiiiii(x64emu_t *emu, uintptr_t fnc); void vFiiiuil(x64emu_t *emu, uintptr_t fnc); void vFiiilpi(x64emu_t *emu, uintptr_t fnc); void vFiiuilp(x64emu_t *emu, uintptr_t fnc); +void vFiipupV(x64emu_t *emu, uintptr_t fnc); void vFiffiff(x64emu_t *emu, uintptr_t fnc); void vFiddidd(x64emu_t *emu, uintptr_t fnc); void vFilipli(x64emu_t *emu, uintptr_t fnc); @@ -3189,15 +3189,15 @@ void iFEipiip(x64emu_t *emu, uintptr_t fnc); #endif #if !defined(STATICBUILD) -void lFiV(x64emu_t *emu, uintptr_t fnc); +void lFiN(x64emu_t *emu, uintptr_t fnc); void iFlip(x64emu_t *emu, uintptr_t fnc); void iFLLi(x64emu_t *emu, uintptr_t fnc); void iFLLii(x64emu_t *emu, uintptr_t fnc); void WFpLLu(x64emu_t *emu, uintptr_t fnc); -void lFpLpV(x64emu_t *emu, uintptr_t fnc); void iFEipup(x64emu_t *emu, uintptr_t fnc); void iFEiipup(x64emu_t *emu, uintptr_t fnc); void iFpipppL(x64emu_t *emu, uintptr_t fnc); +void lFpLpdddddd(x64emu_t *emu, uintptr_t fnc); #endif void vFEv(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 71b6ccbe..5333b90b 100644 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -41,6 +41,7 @@ #include <sys/resource.h> #include <sys/prctl.h> #include <sys/ptrace.h> +#include <error.h> #undef LOG_INFO #undef LOG_DEBUG @@ -902,6 +903,14 @@ EXPORT int my_vsprintf(x64emu_t* emu, void* buff, void * fmt, x64_va_list_t b) } EXPORT int my___vsprintf_chk(x64emu_t* emu, void* buff, void * fmt, x64_va_list_t b) __attribute__((alias("my_vsprintf"))); +EXPORT int my_scanf(x64emu_t* emu, void* fmt, uint64_t* b) +{ + myStackAlignScanf(emu, (const char*)fmt, b, emu->scratch, 1); + PREPARE_VALIST; + + return vscanf(fmt, VARARGS); +} + EXPORT int my_vfscanf(x64emu_t* emu, void* stream, void* fmt, x64_va_list_t b) { (void)emu; @@ -928,6 +937,38 @@ EXPORT int my_vsscanf(x64emu_t* emu, void* stream, void* fmt, x64_va_list_t b) EXPORT int my___vsscanf(x64emu_t* emu, void* stream, void* fmt, void* b) __attribute__((alias("my_vsscanf"))); +EXPORT int my_vfwscanf(x64emu_t* emu, void* F, void* fmt, x64_va_list_t b) +{ + (void)emu; + #ifdef CONVERT_VALIST + CONVERT_VALIST(b); + #else + myStackAlignScanfWValist(emu, (const char*)fmt, emu->scratch, b); + PREPARE_VALIST; + #endif + return vfwscanf(F, fmt, VARARGS); +} + +EXPORT int my_vwscanf(x64emu_t* emu, void* fmt, x64_va_list_t b) +{ + (void)emu; + #ifdef CONVERT_VALIST + CONVERT_VALIST(b); + #else + myStackAlignScanfWValist(emu, (const char*)fmt, emu->scratch, b); + PREPARE_VALIST; + #endif + return vwscanf(fmt, VARARGS); +} + +EXPORT int my_wscanf(x64emu_t* emu, void* fmt, uint64_t* b) +{ + myStackAlignScanfW(emu, (const char*)fmt, b, emu->scratch, 1); + PREPARE_VALIST; + + return vwscanf(fmt, VARARGS); +} + EXPORT int my_vswscanf(x64emu_t* emu, void* stream, void* fmt, x64_va_list_t b) { (void)emu; @@ -1078,31 +1119,43 @@ EXPORT int my_swscanf(x64emu_t* emu, void* stream, void* fmt, uint64_t* b) return vswscanf(stream, fmt, VARARGS); } -#if 0 -EXPORT void my_verr(x64emu_t* emu, int eval, void* fmt, void* b) { - #ifndef NOALIGN - myStackAlignW((const char*)fmt, (uint32_t*)b, emu->scratch); +EXPORT void my_error(x64emu_t *emu, int status, int errnum, void* fmt, void* b) { + myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 3); PREPARE_VALIST; - void* f = verr; - ((vFipp_t)f)(eval, fmt, VARARGS); - #else - void* f = verr; - ((vFipp_t)f)(eval, fmt, (uint32_t*)b); - #endif + char buf[512]; + vsnprintf(buf, 512, (const char*)fmt, VARARGS); + error(status, errnum, "%s", buf); +} +EXPORT void my_error_at_line(x64emu_t *emu, int status, int errnum, void* filename, uint32_t linenum, void* fmt, void* b) { + myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 5); + PREPARE_VALIST; + char buf[512]; + vsnprintf(buf, 512, (const char*)fmt, VARARGS); + error_at_line(status, errnum, filename, linenum, "%s", buf); } -EXPORT void my_vwarn(x64emu_t* emu, void* fmt, void* b) { - #ifndef NOALIGN - myStackAlignW((const char*)fmt, (uint32_t*)b, emu->scratch); +EXPORT void my_verr(x64emu_t* emu, int eval, void* fmt, x64_va_list_t b) { + if (!fmt) + return err(eval, NULL); + #ifdef CONVERT_VALIST + (void)emu; + CONVERT_VALIST(b); + #else + myStackAlignValist(emu, (const char*)fmt, emu->scratch, b); PREPARE_VALIST; - void* f = vwarn; - ((vFpp_t)f)(fmt, VARARGS); + #endif + return verr(eval, fmt, VARARGS); +} +EXPORT void my_verrx(x64emu_t* emu, int eval, void* fmt, x64_va_list_t b) { + #ifdef CONVERT_VALIST + (void)emu; + CONVERT_VALIST(b); #else - void* f = vwarn; - ((vFpp_t)f)(fmt, (uint32_t*)b); + myStackAlignValist(emu, (const char*)fmt, emu->scratch, b); + PREPARE_VALIST; #endif + return verrx(eval, fmt, VARARGS); } -#endif EXPORT void my_err(x64emu_t *emu, int eval, void* fmt, void* b) { myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 2); PREPARE_VALIST; @@ -1113,6 +1166,18 @@ EXPORT void my_errx(x64emu_t *emu, int eval, void* fmt, void* b) { PREPARE_VALIST; verrx(eval, (const char*)fmt, VARARGS); } +EXPORT void my_vwarn(x64emu_t* emu, void* fmt, x64_va_list_t b) { + if (!fmt) + return warn(NULL); + #ifdef CONVERT_VALIST + (void)emu; + CONVERT_VALIST(b); + #else + myStackAlignValist(emu, (const char*)fmt, emu->scratch, b); + PREPARE_VALIST; + #endif + return vwarn(fmt, VARARGS); +} EXPORT void my_warn(x64emu_t *emu, void* fmt, void* b) { myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 1); PREPARE_VALIST; diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h index 869827d1..39cd116b 100644 --- a/src/wrapped/wrappedlibc_private.h +++ b/src/wrapped/wrappedlibc_private.h @@ -307,8 +307,8 @@ GOW(erand48_r, iFppp) GOM(err, vFEipV) //DATAB(errno, GO(__errno_location, pFv) -GOW(error, vFiipV) -//GOWM(error_at_line, vFiipupV) +GOWM(error, vFiipV) +GOWM(error_at_line, vFiipupV) //DATAB(error_message_count, 4) //DATAB(error_one_per_line, 4) //DATAM(error_print_progname, 8) @@ -1702,7 +1702,7 @@ GOWM(scandir, iFEpppp) GOWM(scandir64, iFEpppp) GOWM(scandirat, iFipppp) //GOM(scandirat64, iFipppp) -GO(scanf, iFpV) +GOM(scanf, iFpV) GO(__sched_cpualloc, pFL) GO(__sched_cpucount, iFLp) GO(__sched_cpufree, vFp) @@ -1945,7 +1945,7 @@ GO(strerror_r, pFipL) //GO(strfmon, lFpLpV) //GO(__strfmon_l, #else -GO(strfmon, lFpLpV) +GO(strfmon, lFpLpdddddd) // should be V, but only double are allowed... //GO(__strfmon_l, #endif GOW(strfmon_l, lFpLppdddddd) // should be V, but only double are allowed... @@ -2237,7 +2237,7 @@ GOW(ulckpwdf, iFv) #ifdef STATICBUILD //GOW(ulimit, lFiV) #else -GOW(ulimit, lFiV) +GOW(ulimit, lFiN) #endif GOW(umask, uFu) GOW(umount, iFp) @@ -2273,8 +2273,8 @@ GOWM(vasprintf, iFEppA) GOM(__vasprintf_chk, iFEpipp) GOM(vdprintf, iFEipA) GOM(__vdprintf_chk, iFEiipA) -GO(verr, vFipA) -GO(verrx, vFipA) +GOM(verr, vFEipA) +GOM(verrx, vFEipA) GOW(versionsort, iFpp) GOW(versionsort64, iFpp) //GO(__vfork, @@ -2285,7 +2285,7 @@ GOM(__vfprintf_chk, iFEpvpp) GOWM(vfscanf, iFESpA) GOWM(vfwprintf, iFESpA) GOM(__vfwprintf_chk, iFEpipA) -GOW(vfwscanf, iFSpA) +GOWM(vfwscanf, iFSpA) GO(vhangup, iFv) //GO(vlimit, GO(vmsplice, lFipLu) @@ -2309,7 +2309,7 @@ GO(vwarn, vFpA) GO(vwarnx, vFpA) GOM(vwprintf, iFEpA) //GO(__vwprintf_chk, -GO(vwscanf, iFpA) +GOM(vwscanf, iFpA) GOW(__wait, iFp) GOW(wait, iFp) GOW(wait3, iFpip) @@ -2441,7 +2441,7 @@ GOW(__write, lFipL) GO(write, lFipL) //GO(__write_nocancel, GOW(writev, lFipi) -GO(wscanf, iFpV) +GOM(wscanf, iFEpV) //GO(__wuflow, //GO(__wunderflow, //GO(xdecrypt, @@ -2633,8 +2633,8 @@ GOM(__libc_init, vFEpppp) GO(__errno, pFv) #else // Those symbols don't exist in non-Android builds -//GOM(__libc_init, -//GO(__errno, +//GOM(__libc_init, +//GO(__errno, #endif #ifdef STATICBUILD GO(dummy_pFLp, pFLp) |