Fixing bugs exposed by scan-build
[tpg/acess2.git] / Kernel / syscalls.c
index 936bf27..35e4890 100644 (file)
@@ -7,6 +7,7 @@
 #include <acess.h>
 #include <syscalls.h>
 #include <proc.h>
+#include <hal_proc.h>
 #include <errno.h>
 #include <threads.h>
 
@@ -66,10 +67,7 @@ void SyscallHandler(tSyscallRegs *Regs)
        // -- Clone the current thread
        case SYS_CLONE:
                // Call clone system call
-               ret = Proc_Clone(&err, Regs->Arg1);
-               // Change user stack if a new stack address is passed
-               if(ret == 0 && Regs->Arg2)
-                       Regs->StackPointer = Regs->Arg2;
+               ret = Proc_Clone(Regs->Arg1);
                break;
        
        // -- Send a signal
@@ -158,16 +156,18 @@ void SyscallHandler(tSyscallRegs *Regs)
                                CHECK_NUM_NONULL( &tmp[i], sizeof(char*) );
                                CHECK_STR_NONULL( tmp[i] );
                        }
+                       if(ret == -1) break;
                        // Check EnvP also
                        // - EnvP can be NULL
                        if( Regs->Arg3 )
                        {
                                tmp = (char**)Regs->Arg3;
-                               //Log("tmp = %p", tmp);
+                               CHECK_NUM_NONULL(tmp, sizeof(char**));
                                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] );
                                }
+                               if(ret == -1) break;
                        }
                }
                LEAVE('s', "Assuming 0");
@@ -314,22 +314,25 @@ void SyscallHandler(tSyscallRegs *Regs)
        // -- Debug
        //#if DEBUG_BUILD
        case SYS_DEBUG:
-               LogF("Log: [%i] ", Threads_GetTID());
-               LogF((char*)Regs->Arg1,
+               CHECK_STR_NONULL( (char*)Regs->Arg1 );
+               LogF("Log: %08lli [%i] ", now(), Threads_GetTID());
+               LogF((const char*)Regs->Arg1,
                        Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6);
-               LogF("\n");
+               LogF("\r\n");
                break;
        //#endif
        
        // -- Default (Return Error)
        default:
-               Warning("SyscallHandler: Unknown System Call %i", Regs->Num);
+               Log_Warning("Syscalls", "Unknown System Call %i", Regs->Num);
                if(Regs->Num < NUM_SYSCALLS)
-                       Warning(" Syscall '%s'", cSYSCALL_NAMES[Regs->Num]);
+                       Log_Warning("Syscall", " named '%s'", cSYSCALL_NAMES[Regs->Num]);
                err = -ENOSYS;
                ret = -1;
                break;
        }
+
+       if(err == 0)    err = errno;
        
        if(err != 0) {
                LOG("ID: %i, Return errno = %i", Regs->Num, err);
@@ -347,10 +350,10 @@ void SyscallHandler(tSyscallRegs *Regs)
        if( callNum != SYS_READ && callNum != SYS_WRITE ) {
        # endif
        LOG("err = %i", err);
-       if(Regs->Num != SYS_EXECVE)
-               LEAVE('x', ret);
-       else
+       if( callNum == SYS_EXECVE )
                LOG("Actual %i", ret);
+       else
+               LEAVE('x', ret);
        # if DEBUG < 2
        }
        # endif

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