X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Flibacess-native.so_src%2Fmain.c;h=7f62545f979c18a492f18cc1ed5368df5d8535c0;hb=feb0895318d823867b858ec841589ca3ab81f510;hp=900a14c0c26c169ce3d8eb1b60689f27d446aff4;hpb=4ab2ee475505478c2e1fa6547e94b480ef1308ec;p=tpg%2Facess2.git diff --git a/AcessNative/libacess-native.so_src/main.c b/AcessNative/libacess-native.so_src/main.c index 900a14c0..7f62545f 100644 --- a/AcessNative/libacess-native.so_src/main.c +++ b/AcessNative/libacess-native.so_src/main.c @@ -5,10 +5,10 @@ #include #include #include - -extern int giSyscall_ClientID; -extern void Request_Preinit(void); -extern int acess__SysOpen(const char *Path, unsigned int flags); +#include +#include "common.h" +#include +#include "../ld-acess_src/exports.h" #ifdef __WINDOWS__ int DllMain(void) @@ -40,7 +40,7 @@ int libacessnative_init(int argc, char *argv[], char **envp) { Request_Preinit(); - const char *preopens = getenv_p(envp, "AN_PREOPEN"); + const char *preopens = getenv_p(envp, ENV_VAR_PREOPENS); printf("preopens = %s\n", preopens); if( preopens ) { @@ -59,7 +59,7 @@ int libacessnative_init(int argc, char *argv[], char **envp) path[len] = 0; int fd = acess__SysOpen(path, 6); // WRITE,READ,no EXEC if( fd == -1 ) { - fprintf(stderr, "Unable to preopen '%s'\n", path); + fprintf(stderr, "Unable to preopen '%s' errno=%i\n", path, acess__errno); } if( !splitter ) @@ -68,12 +68,44 @@ int libacessnative_init(int argc, char *argv[], char **envp) } } -// if( !getenv("ACESSNATIVE_ID") +// if( !getenv(ENV_VAR_KEY) return 0; } #endif +int acessnative_spawn(const char *Binary, int SyscallID, const char * const * argv, const char * const * envp) +{ + int envc = 0; + while( envp && envp[envc++] ) + envc ++; + + // Set environment variables for libacess-native + // > ACESSNATIVE_KEY=`newID` + size_t keystr_len = snprintf(NULL, 0, "%s=%i", ENV_VAR_KEY, SyscallID); + char keystr[keystr_len+1]; + snprintf(keystr, keystr_len+1, "%s=%i", ENV_VAR_KEY, SyscallID); + bool bKeyHit = false; + + const char *newenv[envc+2+1]; + int i = 0; + for( ; envp && envp[i]; i ++ ) + { + const char *ev = envp[i]; + if( strncmp(ev, ENV_VAR_KEY"=", sizeof(ENV_VAR_KEY"=")) == 0 ) { + ev = keystr; + bKeyHit = true; + } + newenv[i] = ev; + } + if( !bKeyHit ) + newenv[i++] = keystr; + newenv[i++] = getenv("LD_LIBRARY_PATH") - (sizeof("LD_LIBRARY_PATH=")-1); // VERY hacky + newenv[i] = NULL; + + // TODO: Detect native_spawn failing + return native_spawn(Binary, argv, newenv); +} void Debug(const char *format, ...) { @@ -103,3 +135,9 @@ void __libc_csu_init() { } +void __stack_chk_fail(void) +{ + fprintf(stderr, "__stack_chk_fail"); + exit(1); +} +