Changes to the module loader to handle specific errors from modules
[tpg/acess2.git] / Kernel / syscalls.c
index fb574ef..523b3f2 100644 (file)
@@ -4,23 +4,19 @@
  */
 #define DEBUG  0
 
-#include <common.h>
+#include <acess.h>
 #include <syscalls.h>
 #include <proc.h>
 #include <errno.h>
 
-#define CHECK_NUM_NULLOK(v,size)       do {\
-       if((v)&&!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}\
-       }while(0)
-#define CHECK_STR_NULLOK(v)    do {\
-       if((v)&&!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}\
-       }while(0)
-#define CHECK_NUM_NONULL(v,size)       do {\
-       if(!(v)||!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}\
-       }while(0)
-#define CHECK_STR_NONULL(v)    do {\
-       if(!(v)||!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}\
-       }while(0)
+#define CHECK_NUM_NULLOK(v,size)       \
+       if((v)&&!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}
+#define CHECK_STR_NULLOK(v)    \
+       if((v)&&!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}
+#define CHECK_NUM_NONULL(v,size)       \
+       if(!(v)||!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}
+#define CHECK_STR_NONULL(v)    \
+       if(!(v)||!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}
 
 // === IMPORTS ===
 extern int     Proc_Clone(Uint *Err, Uint Flags);
@@ -29,14 +25,13 @@ extern Uint Proc_SendMessage(Uint *Err, Uint Dest, Uint Length, void *Data);
 extern int     Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer);
 extern int     Proc_Execve(char *File, char **ArgV, char **EnvP);
 extern Uint    Binary_Load(char *file, Uint *entryPoint);
-extern int     VFS_FInfo(int FD, void *Dest, int MaxACLs);
-extern int     VFS_GetACL(int FD, void *Dest);
-extern int     VFS_ChDir(char *Dest);
 extern int     Threads_SetName(char *NewName);
 extern int     Threads_GetPID();
 extern int     Threads_GetTID();
-extern int     Threads_GetUID();
-extern int     Threads_GetGID();
+extern tUID    Threads_GetUID();
+extern int     Threads_SetUID(Uint *errno, tUID ID);
+extern tGID    Threads_GetGID();
+extern int     Threads_SetGID(Uint *errno, tGID ID);
 
 // === PROTOTYPES ===
  int   Syscall_ValidString(Uint Addr);
@@ -47,13 +42,12 @@ extern int  Threads_GetGID();
 void SyscallHandler(tSyscallRegs *Regs)
 {
        Uint64  ret = 0;
-       Uint    err = 0;
-       #if DEBUG
+       Uint    err = -EOK;
+       
        ENTER("iThread iNum", Threads_GetTID(), Regs->Num);
        if(Regs->Num < NUM_SYSCALLS)
                LOG("Syscall %s", cSYSCALL_NAMES[Regs->Num]);
-       LOG("Arg1: 0x%x, Arg2: 0x%x, Arg3: 0x%x", Regs->Arg1, Regs->Arg2, Regs->Arg3);
-       #endif
+       LOG("Arg1: 0x%x, Arg2: 0x%x, Arg3: 0x%x, Arg4: 0x%x", Regs->Arg1, Regs->Arg2, Regs->Arg3, Regs->Arg4);
        
        switch(Regs->Num)
        {
@@ -112,8 +106,8 @@ void SyscallHandler(tSyscallRegs *Regs)
        case SYS_GETGID:        ret = Threads_GetGID(); break;
        
        // -- Set User/Group IDs
-       case SYS_SETUID:        Log("Setting User ID to %i", Regs->Arg1);       break;
-       case SYS_SETGID:        Log("Setting Group ID to %i", Regs->Arg1);      break;
+       case SYS_SETUID:        ret = Threads_SetUID(&err, Regs->Arg1); break;
+       case SYS_SETGID:        ret = Threads_SetGID(&err, Regs->Arg1); break;
        
        // -- Send Message
        case SYS_SENDMSG:
@@ -124,9 +118,10 @@ void SyscallHandler(tSyscallRegs *Regs)
        // -- Check for messages
        case SYS_GETMSG:
                CHECK_NUM_NULLOK(Regs->Arg1, sizeof(Uint));
-               //NOTE: Uncertain due to length being unknown
-               // (Proc_GetMessage should check itself)
-               CHECK_NUM_NULLOK(Regs->Arg2, sizeof(Uint)*4);
+               if( Regs->Arg2 && Regs->Arg2 != -1 && !MM_IsUser(Regs->Arg2) )
+               {
+                       err = -EINVAL;  ret = -1;       break;
+               }
                // *Source, *Data
                ret = Proc_GetMessage(&err, (Uint*)Regs->Arg1, (void*)Regs->Arg2);
                break;
@@ -142,13 +137,15 @@ void SyscallHandler(tSyscallRegs *Regs)
        // ---
        case SYS_EXECVE:
                CHECK_STR_NONULL(Regs->Arg1);
+               //Log(" Regs = {Arg2: %x, Arg3: %x}", Regs->Arg2, Regs->Arg3);
                {
                         int    i;
                        char    **tmp = (char**)Regs->Arg2;
                        // Check ArgV (traverse array checking all string pointers)
                        CHECK_NUM_NONULL( tmp, sizeof(char**) );
+                       //Log("tmp = %p", tmp);
                        for(i=0;tmp[i];i++) {
-                               CHECK_NUM_NULLOK( &tmp[i], sizeof(char*) );
+                               CHECK_NUM_NONULL( &tmp[i], sizeof(char*) );
                                CHECK_STR_NONULL( tmp[i] );
                        }
                        // Check EnvP also
@@ -156,12 +153,14 @@ void SyscallHandler(tSyscallRegs *Regs)
                        if( Regs->Arg3 )
                        {
                                tmp = (char**)Regs->Arg3;
+                               //Log("tmp = %p", tmp);
                                for(i=0;tmp[i];i++) {
                                        CHECK_NUM_NULLOK( &tmp[i], sizeof(char*) );
                                        CHECK_STR_NONULL( tmp[i] );
                                }
                        }
                }
+               LEAVE('s', "Assuming 0");
                // Path, **Argv, **Envp
                ret = Proc_Execve((char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3);
                break;
@@ -211,7 +210,7 @@ void SyscallHandler(tSyscallRegs *Regs)
                break;
        
        case SYS_FINFO:
-               CHECK_NUM_NONULL( Regs->Arg2, sizeof(struct s_sysFInfo) + Regs->Arg3*sizeof(tVFS_ACL) );
+               CHECK_NUM_NONULL( Regs->Arg2, sizeof(tFInfo) + Regs->Arg3*sizeof(tVFS_ACL) );
                // FP, Dest, MaxACLs
                ret = VFS_FInfo( Regs->Arg1, (void*)Regs->Arg2, Regs->Arg3 );
                break;
@@ -278,12 +277,12 @@ void SyscallHandler(tSyscallRegs *Regs)
                break;
        
        // -- Debug
-       #if DEBUG_BUILD
+       //#if DEBUG_BUILD
        case SYS_DEBUG:
                Log((char*)Regs->Arg1,
                        Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6);
                break;
-       #endif
+       //#endif
        
        // -- Default (Return Error)
        default:
@@ -294,6 +293,11 @@ void SyscallHandler(tSyscallRegs *Regs)
                ret = -1;
                break;
        }
+       
+       if(err != 0) {
+               LOG("ID: %i, Return errno = %i", Regs->Num, err);
+       }
+       
        #if BITS < 64
        Regs->Return = ret&0xFFFFFFFF;
        Regs->RetHi = ret >> 32;
@@ -303,7 +307,10 @@ void SyscallHandler(tSyscallRegs *Regs)
        Regs->Error = err;
        #if DEBUG
        LOG("err = %i", err);
-       LEAVE('x', ret);
+       if(Regs->Num != SYS_EXECVE)
+               LEAVE('x', ret);
+       else
+               LOG("Actual %i", ret);
        #endif
 }
 

UCC git Repository :: git.ucc.asn.au