On 25 mar 2014, at 13:46, Dmitry Samersoff <[email protected]> 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.