RFR 9: 8081567 : java/lang/ProcessHandle/InfoTest.java failed Cannot run program "whoami"

Roger Riggs Roger.Riggs at Oracle.com
Wed Jun 3 18:32:47 UTC 2015


Hi Ivan,

Corrections updated in place:
     http://cr.openjdk.java.net/~rriggs/webrev-whoami-8081567/


On 6/3/2015 5:48 AM, Ivan Gerasimov wrote:
>
>
> On 03.06.2015 1:22, Roger Riggs wrote:
>> Hi Ivan,
>>
>> Thanks for the review.
>>
>> Updated the webrev in place with 2 corrections.
>>     http://cr.openjdk.java.net/~rriggs/webrev-whoami-8081567
>>
>> On 6/2/2015 5:37 PM, Ivan Gerasimov wrote:
>>> 1)
>>>
>>> +    if (domainLen > 0) {
>>> +      wcscat(domain, L"\\");
>>> +    } else {
>>> +      domain[0] = L'\0';
>>> +    }
>>> +    wcscat(domain, name);
>>>
>>> Here, domainLen is either equal to whatever LookupAccountSid has set 
>>> it to.
>>>
>>> In MSDN [1] it's written:
>>> On input, specifies the size, in TCHARs, of the 
>>> lpReferencedDomainName buffer. If the function fails because the 
>>> buffer is too small or if cchReferencedDomainName is zero, 
>>> cchReferencedDomainName receives the required buffer size, including 
>>> the terminating null character.
>>>
>>> I see in the comments that in fact on success this parameter 
>>> receives the length of the resulting string.
>>> But should we rely on that undocumented behavior?
>> Returning the actual size is (one) convention of a number of Win APIs.
>
> My concern is that I don't see this convention explicitly stated, at 
> least in the documentation for LookupAccountSidW().
> On the other hand, the doc does promise that the string will be 
> null-terminated upon successful call.
>
> Thus, I think it's safer to just remove lines 423-427 and do 
> concatenation right away, unless you have evidence that 
> LookupAccountSidW may fail to produce null-terminated string, 
> contradicting the documentation.
> In the later case, I think, it should be stated in the comments.
ok; and similar to code in WindowsNativeDispatcher.c and 
WindowsUserPrincipals
the concatenation should be unconditional.

>
>>> Does it really happen that LookupAccountSidW() returns 0, setting 
>>> domainLen to 0 and leaving the domain buffer uninitialized?
>>> From the published example [2] it seems that this shouldn't happen.
>> Only successful calls reach the code in question.
>> If domainLen is returned as zero, the domain[0] is zero terminated; 
>> not counting on the API to do it.
>> Otherwise, it returned (some) string and it is null terminated.
>> Am I misunderstanding the case?
>>>
>>> 2)
>>> I think domainLen should be set to
>>>      DWORD domainLen = sizeof(domain) - sizeof(name) - 1;
>>> Otherwise LookupAccountSid is allowed to fill up the whole buffer, 
>>> so that 'name' could not be appended.
>> Agree, but I think it should be -2;  one for the delimiter and for 
>> the trailing \0.
>
> I was thinking of 256 (== sizeof(domain) - sizeof(name) - 1) for the 
> domain + \0.
> Then the trailing \0 is replaced with the delimiter and the remaining 
> 256 WCHARs can be used for the name + \0;
ok
>
>> I could not find a maximum length of a domain or name and picked 255.
>
> The example from MSDN [2] uses 256 for the name + terminating null, so 
> I think it should be fine.
> To be extra-safe we could check GetLastError() for ERROR_NONE_MAPPED 
> and in such rare cases allocate the buffers dynamically.
I don't see that NONE_MAPPED is associated with the output buffers.

But taking the lead from the code in WindowsNativeDispatcher.c for 
producting
the SID, I added code to fallback to the String version.

Thanks, Roger

>
> Sincerely yours,
> Ivan
>
>>>
>>> 3)
>>> Indentation isn't consistent: it should be multiple of 4.
>> Thanks, helpful but not correct emacs c-mode.
>>
>> Roger
>>
>>>
>>> Sincerely yours,
>>> Ivan
>>>
>>> [1] 
>>> https://msdn.microsoft.com/en-us/library/windows/desktop/aa379166%28v=vs.85%29.aspx
>>> [2] 
>>> https://msdn.microsoft.com/en-us/library/windows/desktop/aa379554(v=vs.85).aspx
>>>
>>>> Issue:
>>>>   https://bugs.openjdk.java.net/browse/JDK-8081567
>>>>
>>>> Thanks, Roger
>>>>
>>>>
>>>
>>
>>
>




More information about the core-libs-dev mailing list