diff -r 6613e685b45b -r ea61550036b5 core/systems/HandleSys.cpp --- a/core/systems/HandleSys.cpp Thu Feb 22 02:20:15 2007 +0000 +++ b/core/systems/HandleSys.cpp Mon Feb 26 02:47:03 2007 +0000 @@ -283,6 +283,7 @@ pHandle->serial = m_HSerial; pHandle->owner = owner; pHandle->ch_next = 0; + pHandle->access_special = false; /* Create the hash value */ Handle_t hash = pHandle->serial; @@ -336,8 +337,25 @@ m_Types[type].typeSec.ident = pToken; } -Handle_t HandleSystem::CreateHandleEx(HandleType_t type, void *object, IdentityToken_t *owner, IdentityToken_t *ident, HandleError *err, bool identity) +Handle_t HandleSystem::CreateHandleInt(HandleType_t type, + void *object, + const HandleSecurity *pSec, + HandleError *err, + const HandleAccess *pAccess, + bool identity) { + IdentityToken_t *ident; + IdentityToken_t *owner; + + if (pSec) + { + ident = pSec->pIdentity; + owner = pSec->pOwner; + } else { + ident = NULL; + owner = NULL; + } + if (!type || type >= HANDLESYS_TYPEARRAY_SIZE || m_Types[type].dispatch == NULL) @@ -376,15 +394,31 @@ return 0; } + if (pAccess) + { + pHandle->access_special = true; + pHandle->sec = *pAccess; + } + pHandle->object = object; pHandle->clone = 0; return handle; } +Handle_t HandleSystem::CreateHandleEx(HandleType_t type, void *object, const HandleSecurity *pSec, const HandleAccess *pAccess, HandleError *err) +{ + return CreateHandleInt(type, object, pSec, err, pAccess, false); +} + Handle_t HandleSystem::CreateHandle(HandleType_t type, void *object, IdentityToken_t *owner, IdentityToken_t *ident, HandleError *err) { - return CreateHandleEx(type, object, owner, ident, err, false); + HandleSecurity sec; + + sec.pIdentity = ident; + sec.pOwner = owner; + + return CreateHandleEx(type, object, &sec, NULL, err); } bool HandleSystem::TypeCheck(HandleType_t intype, HandleType_t outtype) @@ -447,7 +481,14 @@ bool HandleSystem::CheckAccess(QHandle *pHandle, HandleAccessRight right, const HandleSecurity *pSecurity) { QHandleType *pType = &m_Types[pHandle->type]; - unsigned int access = pType->hndlSec.access[right]; + unsigned int access; + + if (pHandle->access_special) + { + access = pHandle->sec.access[right]; + } else { + access = pType->hndlSec.access[right]; + } /* Check if the type's identity matches */ if (access & HANDLE_RESTRICT_IDENTITY) @@ -487,6 +528,13 @@ return err; } + /* Assign permissions from parent */ + if (pHandle->access_special) + { + pNewHandle->access_special = true; + pNewHandle->sec = pHandle->sec; + } + pNewHandle->clone = index; pHandle->refcount++;