X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fbinary.c;h=5170dac06ccda9de159b0f49ac54f3795d31781c;hb=9eadc33399e705035c33e8434a9644d91e44ed44;hp=46f93232799a01083eb03e5180cd80c53b6e358d;hpb=82595a34a73b4667a98349cceeb17f618bd41282;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/binary.c b/KernelLand/Kernel/binary.c index 46f93232..5170dac0 100644 --- a/KernelLand/Kernel/binary.c +++ b/KernelLand/Kernel/binary.c @@ -31,7 +31,7 @@ extern tKernelSymbol gKernelSymbolsEnd[]; extern tBinaryType gELF_Info; // === PROTOTYPES === - int Binary_int_CacheArgs(const char **Path, const char ***ArgV, const char ***EnvP, void *DestBuffer); +size_t 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); @@ -95,9 +95,10 @@ int Proc_Spawn(const char *Path) /** * \todo Document */ -int Binary_int_CacheArgs(const char **Path, const char ***ArgV, const char ***EnvP, void *DestBuffer) +size_t Binary_int_CacheArgs(const char **Path, const char ***ArgV, const char ***EnvP, void *DestBuffer) { - int size, argc=0, envc=0; + size_t size; + int argc=0, envc=0; int i; char *strbuf; const char **arrays; @@ -172,21 +173,17 @@ int Binary_int_CacheArgs(const char **Path, const char ***ArgV, const char ***En */ int Proc_SysSpawn(const char *Binary, const char **ArgV, const char **EnvP, int nFD, int *FDs) { - void *handles; - void *cachebuf; - int size; - tPID ret; // --- Save File, ArgV and EnvP - size = Binary_int_CacheArgs( &Binary, &ArgV, &EnvP, NULL ); - cachebuf = malloc( size ); + size_t size = Binary_int_CacheArgs( &Binary, &ArgV, &EnvP, NULL ); + void *cachebuf = malloc( size ); Binary_int_CacheArgs( &Binary, &ArgV, &EnvP, cachebuf ); // Cache the VFS handles - handles = VFS_SaveHandles(nFD, FDs); + void *handles = VFS_SaveHandles(nFD, FDs); // Create new process - ret = Proc_Clone(CLONE_VM|CLONE_NOUSER); + tPID ret = Proc_Clone(CLONE_VM|CLONE_NOUSER); if( ret == 0 ) { VFS_RestoreHandles(nFD, handles); @@ -234,23 +231,19 @@ int Proc_int_Execve(const char *File, const char **ArgV, const char **EnvP, int } // --- Get argc - for( argc = 0; ArgV && ArgV[argc]; argc ++ ); + for( argc = 0; ArgV && ArgV[argc]; argc ++ ) + ; // --- Set Process Name Threads_SetName(File); // --- 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; - handles = VFS_SaveHandles(nfd, NULL); - VFS_CloseAllUserHandles(); + // MM_ClearUser should preserve handles MM_ClearUser(); - VFS_RestoreHandles(nfd, handles); - VFS_FreeSavedHandles(nfd, handles); + // - NOTE: Not a reliable test, but helps for now + ASSERTC( VFS_IOCtl(0, 0, NULL), !=, -1 ); } // --- Load new binary @@ -337,6 +330,8 @@ tVAddr Binary_Load(const char *Path, tVAddr *EntryPoint) if(pBinary->Interpreter) { tVAddr start; if( Binary_Load(pBinary->Interpreter, &start) == 0 ) { + Log_Error("Binary", "Can't load interpeter '%s' for '%s'", + pBinary->Interpreter, Path); LEAVE('x', 0); return 0; }