X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fbinary.c;h=cca55b481cca1dcf5ce90d5de38cd62ac9bb5539;hb=82e814024416fac7949a1e158a4532a5a1ed546f;hp=8a8bc3eba7a389eecb9f0986c4a06fa2d678221e;hpb=67c9c489ba80c23739854905cf6d2f378193c9a8;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/binary.c b/KernelLand/Kernel/binary.c index 8a8bc3eb..cca55b48 100644 --- a/KernelLand/Kernel/binary.c +++ b/KernelLand/Kernel/binary.c @@ -32,6 +32,7 @@ extern tBinaryType gELF_Info; // === PROTOTYPES === int Binary_int_CacheArgs(const char **Path, const char ***ArgV, const char ***EnvP, void *DestBuffer); + int Proc_int_Execve(const char *File, const char **ArgV, const char **EnvP, int DataSize, bool bClearUser); tVAddr Binary_Load(const char *Path, tVAddr *EntryPoint); tBinary *Binary_GetInfo(tMount MountID, tInode InodeID); tVAddr Binary_MapIn(tBinary *Binary, const char *Path, tVAddr LoadMin, tVAddr LoadMax); @@ -191,12 +192,13 @@ int Proc_SysSpawn(const char *Binary, const char **ArgV, const char **EnvP, int VFS_RestoreHandles(nFD, handles); VFS_FreeSavedHandles(nFD, handles); // Frees cachebuf - Proc_Execve(Binary, ArgV, EnvP, size); + Proc_int_Execve(Binary, ArgV, EnvP, size, 0); for(;;); } - if( ret < 0 ) + if( ret == -1 ) { VFS_FreeSavedHandles(nFD, handles); + free(cachebuf); } return ret; @@ -210,6 +212,11 @@ int Proc_SysSpawn(const char *Binary, const char **ArgV, const char **EnvP, int * \note Called Proc_ for historical reasons */ int Proc_Execve(const char *File, const char **ArgV, const char **EnvP, int DataSize) +{ + return Proc_int_Execve(File, ArgV, EnvP, DataSize, 1); +} + +int Proc_int_Execve(const char *File, const char **ArgV, const char **EnvP, int DataSize, bool bClearUser) { void *cachebuf; tVAddr entry; @@ -235,6 +242,7 @@ int Proc_Execve(const char *File, const char **ArgV, const char **EnvP, int Data // --- Clear User Address space // NOTE: This is a little roundabout, maybe telling ClearUser to not touch the // PPD area would be a better idea. + if( bClearUser ) { int nfd = *Threads_GetMaxFD(); void *handles; @@ -249,7 +257,7 @@ int Proc_Execve(const char *File, const char **ArgV, const char **EnvP, int Data base = Binary_Load(File, &entry); if(base == 0) { - Log_Warning("Binary", "Proc_Execve - Unable to load '%s'", File); + Log_Warning("Binary", "Proc_Execve - Unable to load '%s' [errno=%i]", File, errno); LEAVE('-'); Threads_Exit(0, -10); for(;;); @@ -822,9 +830,12 @@ Uint Binary_GetSymbolEx(const char *Name, Uint *Value) tKernelBin *pKBin; int numKSyms = ((Uint)&gKernelSymbolsEnd-(Uint)&gKernelSymbols)/sizeof(tKernelSymbol); + LOG("numKSyms = %i", numKSyms); + // Scan Kernel for( i = 0; i < numKSyms; i++ ) { + LOG("KSym %s = %p", gKernelSymbols[i].Name, gKernelSymbols[i].Value); if(strcmp(Name, gKernelSymbols[i].Name) == 0) { *Value = gKernelSymbols[i].Value; return 1; @@ -881,12 +892,12 @@ int Binary_int_CheckMemFree( tVAddr _start, size_t _len ) _start &= ~(PAGE_SIZE-1); LOG("_start = %p, _len = 0x%x", _start, _len); for( ; _len > PAGE_SIZE; _len -= PAGE_SIZE, _start += PAGE_SIZE ) { - if( MM_GetPhysAddr(_start) != 0 ) { + if( MM_GetPhysAddr( (void*)_start ) != 0 ) { LEAVE('i', 1); return 1; } } - if( _len == PAGE_SIZE && MM_GetPhysAddr(_start) != 0 ) { + if( _len == PAGE_SIZE && MM_GetPhysAddr( (void*)_start ) != 0 ) { LEAVE('i', 1); return 1; }