X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fsyscalls.c;h=1f2f798053ef1c365fb122f62c05a43a7efc0c23;hb=802193677c6d85b31030bba5950cb667ff064415;hp=99c794247ba05a0bd481043d42508bc621c29c50;hpb=e9a7ae01935b78f05698668d57c4748a8e931d9a;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/syscalls.c b/KernelLand/Kernel/syscalls.c index 99c79424..1f2f7980 100644 --- a/KernelLand/Kernel/syscalls.c +++ b/KernelLand/Kernel/syscalls.c @@ -12,14 +12,20 @@ #include #include +#if 1 +# define MERR(f,v...) Log_Debug("Syscalls", "0x%x "f, callNum ,## v) +#else +# define MERR(v...) do{}while(0) +#endif + #define CHECK_NUM_NULLOK(v,size) \ - if((v)&&!Syscall_Valid((size),(v))){ret=-1;err=-EINVAL;break;} + if((v)&&!Syscall_Valid((size),(v))){MERR("CHECK_NUM_NULLOK: %p(%x) FAIL",v,size);ret=-1;err=-EINVAL;break;} #define CHECK_STR_NULLOK(v) \ - if((v)&&!Syscall_ValidString((v))){ret=-1;err=-EINVAL;break;} + if((v)&&!Syscall_ValidString((v))){MERR("CHECK_STR_NULLOK: %p FAIL",v);ret=-1;err=-EINVAL;break;} #define CHECK_NUM_NONULL(v,size) \ - if(!(v)||!Syscall_Valid((size),(v))){ret=-1;err=-EINVAL;break;} + if(!(v)||!Syscall_Valid((size),(v))){MERR("CHECK_NUM_NONULL: %p(%x) FAIL",v,size);ret=-1;err=-EINVAL;break;} #define CHECK_STR_NONULL(v) \ - if(!(v)||!Syscall_ValidString((v))){ret=-1;err=-EINVAL;break;} + if(!(v)||!Syscall_ValidString((v))){MERR("CHECK_STR_NONULL: %p FAIL",v);ret=-1;err=-EINVAL;break;} #define CHECK_STR_ARRAY(arr) do {\ int i;\ char **tmp = (char**)arr; \ @@ -166,7 +172,7 @@ void SyscallHandler(tSyscallRegs *Regs) CHECK_STR_NONULL((const char*)Regs->Arg1); CHECK_STR_ARRAY((const char**)Regs->Arg2); CHECK_STR_ARRAY((const char**)Regs->Arg3); - CHECK_NUM_NONULL((void*)Regs->Arg5, Regs->Arg4*sizeof(int)); + CHECK_NUM_NULLOK((void*)Regs->Arg5, Regs->Arg4*sizeof(int)); ret = Proc_SysSpawn( (const char*)Regs->Arg1, (const char**)Regs->Arg2, (const char**)Regs->Arg3, Regs->Arg4, (int*)Regs->Arg5 @@ -265,6 +271,7 @@ void SyscallHandler(tSyscallRegs *Regs) case SYS_IOCTL: // All sanity checking should be done by the driver if( Regs->Arg3 && !MM_IsUser(Regs->Arg3) ) { + MERR("IOCtl Invalid arg %p", Regs->Arg3); err = -EINVAL; ret = -1; break; } ret = VFS_IOCtl( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 ); @@ -400,7 +407,10 @@ int Syscall_ValidString(const char *Addr) */ int Syscall_Valid(int Size, const void *Addr) { - if(!MM_IsUser( (tVAddr)Addr )) return 0; + if(!MM_IsUser( (tVAddr)Addr )) { + Log_Debug("Syscalls", "Syscall_Valid - %p not user", Addr); + return 0; + } return CheckMem( Addr, Size ); }