X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=KernelLand%2FKernel%2Fvfs%2Fio.c;h=7379e3d2e7ed3e8ce46fa9a76bdaecaaaa86dc09;hb=f19a9d7e00271ffbba6e827da3b553b900acc33c;hp=e7a2a0684370171cbbe3d1ec1889887cfd2ce2bc;hpb=51ab5f489bc356940c95cc936fd0508e8f07ea97;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/io.c b/KernelLand/Kernel/vfs/io.c index e7a2a068..7379e3d2 100644 --- a/KernelLand/Kernel/vfs/io.c +++ b/KernelLand/Kernel/vfs/io.c @@ -20,12 +20,30 @@ Uint64 VFS_Read(int FD, Uint64 Length, void *Buffer) ENTER("iFD XLength pBuffer", FD, Length, Buffer); h = VFS_GetHandle(FD); - if(!h) LEAVE_RET('i', -1); + if(!h) { + LOG("Bad Handle"); + LEAVE_RET('i', -1); + } - if( !(h->Mode & VFS_OPENFLAG_READ) || h->Node->Flags & VFS_FFLAG_DIRECTORY ) + if( !(h->Mode & VFS_OPENFLAG_READ) ) { + LOG("Bad mode"); + LEAVE_RET('i', -1); + } + if( (h->Node->Flags & VFS_FFLAG_DIRECTORY) ) { + LOG("Reading directory"); + LEAVE_RET('i', -1); + } + + if(!h->Node->Type || !h->Node->Type->Read) { + LOG("No read method"); LEAVE_RET('i', -1); + } - if(!h->Node->Type || !h->Node->Type->Read) LEAVE_RET('i', 0); + if( !MM_GetPhysAddr(h->Node->Type->Read) ) { + Log_Error("VFS", "Node type %p(%s) read method is junk %p", h->Node->Type, h->Node, h->Node->Type->TypeName, + h->Node->Type->Read); + LEAVE_RET('i', -1); + } ret = h->Node->Type->Read(h->Node, h->Position, Length, Buffer); if(ret == -1) LEAVE_RET('i', -1); @@ -54,6 +72,13 @@ Uint64 VFS_ReadAt(int FD, Uint64 Offset, Uint64 Length, void *Buffer) Warning("VFS_ReadAt - Node %p, does not have a read method", h->Node); return 0; } + + if( !MM_GetPhysAddr(h->Node->Type->Read) ) { + Log_Error("VFS", "Node type %p(%s) read method is junk %p", h->Node->Type, h->Node, h->Node->Type->TypeName, + h->Node->Type->Read); + LEAVE_RET('i', -1); + } + ret = h->Node->Type->Read(h->Node, Offset, Length, Buffer); if(ret == -1) return -1; return ret; @@ -75,6 +100,12 @@ Uint64 VFS_Write(int FD, Uint64 Length, const void *Buffer) if( h->Node->Flags & VFS_FFLAG_DIRECTORY ) return -1; if( !h->Node->Type || !h->Node->Type->Write ) return 0; + + if( !MM_GetPhysAddr(h->Node->Type->Write) ) { + Log_Error("VFS", "Node type %p(%s) write method is junk %p", h->Node->Type, h->Node, h->Node->Type->TypeName, + h->Node->Type->Write); + return -1; + } ret = h->Node->Type->Write(h->Node, h->Position, Length, Buffer); if(ret == -1) return -1; @@ -99,8 +130,13 @@ Uint64 VFS_WriteAt(int FD, Uint64 Offset, Uint64 Length, const void *Buffer) if( h->Node->Flags & VFS_FFLAG_DIRECTORY ) return -1; if(!h->Node->Type || !h->Node->Type->Write) return 0; - ret = h->Node->Type->Write(h->Node, Offset, Length, Buffer); + if( !MM_GetPhysAddr(h->Node->Type->Write) ) { + Log_Error("VFS", "Node type %p(%s) write method is junk %p", h->Node->Type, h->Node, h->Node->Type->TypeName, + h->Node->Type->Write); + return -1; + } + ret = h->Node->Type->Write(h->Node, Offset, Length, Buffer); if(ret == -1) return -1; return ret; }