Request for review: 7190897 (fs) Files.isWritable method returns false when the path is writable (win). - ver. 1

Alexey Utkin alexey.utkin at oracle.com
Mon Mar 4 12:23:04 UTC 2013


On 04.03.2013 15:51, Alan Bateman wrote:
> On 04/03/2013 09:31, Alexey Utkin wrote:
>> Alan,
>> Do you agree with
>>>     /**
>>>      * Check the access right against the securityInfo in the 
>>> current thread.
>>>      */
>>>     static boolean checkAccessMask(long securityInfo, int accessMask,
>>>         int genericRead, int genericWrite, int genericExecute, int 
>>> genericAll)
>>>         throws WindowsException
>>>     {
>>>         int privilegies = TOKEN_QUERY;
>>>         long hToken = OpenThreadToken(GetCurrentThread(), 
>>> privilegies, false);
>>>         if (hToken == 0L && processTokenWithDuplicateAccess != 0L)
>>>             hToken = DuplicateTokenEx(processTokenWithDuplicateAccess,
>>>                 privilegies);
>>>
We can have the situation with:
1) OpenThreadToken return 0 without exception - that is ok for thread 
without impersonation.
2) processTokenWithDuplicateAccess  is 0 for some reason (weak precess 
privileges)
For that case we have no access to process token without exception 
(hToken :=: 0).
>>>         boolean hasRight = false;
>>>         if (hToken != 0L) {
So, in upper line we need to check token for non-empty value.
! Do you concern about the [false] return value for that case?
>>>             try {
>>>                 hasRight = AccessCheck(hToken, securityInfo, 
>>> accessMask,
>>>                     genericRead, genericWrite, genericExecute, 
>>> genericAll);
Here is the actual work, that can make an exception (for example it 
happens for invalid SID)
>>>             } finally {
>>>                 CloseHandle(hToken);
If token was open it have to be closed without excuses.
>>>             }
>>>         }
>>>         return hasRight;
>>>     }
>> implementation approach?
> Can the handle to the token (hToken) be 0? In my comment I was 
> suggesting:
>
> long hToken = OpenThreadToken(...);
> try {
>     ...
> } finally {
>     CloseHandle(hToken);
> }

> but that doesn't work if OpenThreadToken succeeds with a handle of 0. 
> If 0 is not possible then there are a few other clean-ups that we 
> could do at a later time.
>> Ah, I remember now, we handle ERROR_NO_TOKEN so this means that 
>> hToken can be 0. So this means that the CloseHandle does need to 
>> check for 0 in the finally block.
>>
>> -Alan. 
>
> -Alan
>




More information about the core-libs-dev mailing list