| 503 | } |
| 504 | |
| 505 | HandleError HandleSystem::GetHandle(Handle_t handle, |
| 506 | IdentityToken_t *ident, |
| 507 | QHandle **in_pHandle, |
| 508 | unsigned int *in_index, |
| 509 | bool ignoreFree) |
| 510 | { |
| 511 | unsigned int serial = (handle >> HANDLESYS_HANDLE_BITS); |
| 512 | unsigned int index = (handle & HANDLESYS_HANDLE_MASK); |
| 513 | |
| 514 | if (index == 0 || index > m_HandleTail || index > HANDLESYS_MAX_HANDLES) |
| 515 | { |
| 516 | return HandleError_Index; |
| 517 | } |
| 518 | |
| 519 | QHandle *pHandle = &m_Handles[index]; |
| 520 | |
| 521 | if (!pHandle->set |
| 522 | || (pHandle->set == HandleSet_Freed && !ignoreFree)) |
| 523 | { |
| 524 | return HandleError_Freed; |
| 525 | } else if (pHandle->set == HandleSet_Identity |
| 526 | && ident != g_ShareSys.GetIdentRoot()) |
| 527 | { |
| 528 | /* Only IdentityHandle() can read this! */ |
| 529 | return HandleError_Identity; |
| 530 | } |
| 531 | if (pHandle->serial != serial) |
| 532 | { |
| 533 | return HandleError_Changed; |
| 534 | } |
| 535 | |
| 536 | *in_pHandle = pHandle; |
| 537 | *in_index = index; |
| 538 | |
| 539 | return HandleError_None; |
| 540 | } |
| 541 | |
| 542 | bool HandleSystem::CheckAccess(QHandle *pHandle, HandleAccessRight right, const HandleSecurity *pSecurity) |
| 543 | { |
no test coverage detected