RFR: 8038296 sun/tools/jinfo/Basic.sh: java.io.IOException: Command failed in target VM
Dmitry Samersoff
dmitry.samersoff at oracle.com
Tue Mar 25 18:36:39 UTC 2014
Staffan,
> Yes, that will find problems when trying to convert something like
> ‘bla’. It will not capture the case where the input string is a too
> large (or small) value (value < LONG_MIN or > LONG_MAX). To capture
> both cases it looks like we need something like:
> errno = 0;
> char* end;
> int probe_typess = (int) strtol(probe, &end, 10);
> if (end == probe || errno) {
> return JNI_ERR;
> }
As probe_typess is positive and you are converting long to int
It's be better to check value boundaries explicitly:
char* end;
long ptl = strtol(probe, &end, 10);
if (end == probe || ptl < 0 || ptl > MAX_INT) {
return JNI_ERR;
}
int probe_typess = (int) ptl;
-Dmitry
On 2014-03-25 17:35, Staffan Larsen wrote:
>
> On 25 mar 2014, at 13:46, Dmitry Samersoff
> <dmitry.samersoff at oracle.com> wrote:
>
>> Staffan,
>>
>> strtol() sets errno in two cases -
>>
>> ERANGE if supplied value is less then LONG_MIN or greater than
>> LONG_MAX EINVAL if supplied base is not supported.
>>
>> if you pass probe == 'bla', strtol just return 0 and errno will not
>> be set. So I'm not sure that check for errno has any value here.
>>
>> One of possible way to check that supplied value is convertible to
>> long is
>>
>> char *eptr = probe; strtol(probe, (char **)&eptr, 10); if (eptr ==
>> probe) { // we can't convert supplied value return JNI_ERR; }
>
> Yes, that will find problems when trying to convert something like
> ‘bla’. It will not capture the case where the input string is a too
> large (or small) value (value < LONG_MIN or > LONG_MAX). To capture
> both cases it looks like we need something like:
>
> errno = 0; char* end; int probe_typess = (int) strtol(probe, &end,
> 10); if (end == probe || errno) { return JNI_ERR; }
>
>
> /Staffan
>
>>
>> -Dmitry
>>
>>
>> On 2014-03-25 11:31, Staffan Larsen wrote:
>>> attachListener_solaris.cpp calls atoi() and then checks errno to
>>> see if any errors occurred. The problem is that atoi() does not
>>> set errno, so some old value of errno is checked which sometimes
>>> causes the function to fail.
>>>
>>> The fix is to replace atoi() with strtol() which does set errno.
>>> But errno is only set if an error occurred and not set to 0 in
>>> case of success. Thus, I set errno to 0 before calling strtol()
>>> and check the value afterwards.
>>>
>>> Verified with a JPRT run.
>>>
>>> webrev: http://cr.openjdk.java.net/~sla/8038296/webrev.00/ bug:
>>> https://bugs.openjdk.java.net/browse/JDK-8038296
>>>
>>> Thanks, /Staffan
>>>
>>
>>
>> -- Dmitry Samersoff Oracle Java development team, Saint Petersburg,
>> Russia * I would love to change the world, but they won't give me
>> the sources.
>
--
Dmitry Samersoff
Oracle Java development team, Saint Petersburg, Russia
* I would love to change the world, but they won't give me the sources.
More information about the serviceability-dev
mailing list