You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Boris (JIRA)" <ji...@apache.org> on 2009/01/23 20:49:59 UTC
[jira] Updated: (LANG-481) Possible race-conditions in hashCode of
the range classes
[ https://issues.apache.org/jira/browse/LANG-481?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Boris updated LANG-481:
-----------------------
Description:
The hashCode() methods of the range classes look very suspicious to me. The value is lazily initialized, but the calculation is done _on the cached value. With some unlucky timing a caller may get an incomplete hash.
An unlucky sequence of Code could be something like
T1: if (hashCode == 0)
T1: hashCode = 17;
T2: if (hashCode == 0)
T2: return hashCode;
T1: hashCode = 37 * hashCode...........
where T1 and T2 are different threads accessing the method in parallel and T2 gets the wrong hash "17".
Affected classes are
org.apache.commons.lang.math.DoubleRange
org.apache.commons.lang.math.FloatRange
org.apache.commons.lang.math.IntRange
org.apache.commons.lang.math.LongRange
org.apache.commons.lang.math.NumberRange
org.apache.commons.lang.math.Range
Possible fix: calculate the hash on a temporary variable and finally assign it to the member
was:
The hashCode() methods of the range classes look very suspicious to me. The value is lazily initialized, but the calculation is done _on the cached value. With some unlucky timing a caller may get an incomplete hash.
An unlucky sequence of Code could be something like
{{T1: if (hashCode == 0)
T1: hashCode = 17;
T2: if (hashCode == 0)
T2: return hashCode;
T1: hashCode = 37 * hashCode...........}}
where T1 and T2 are different threads accessing the method in parallel and T2 gets the wrong hash "17".
Affected classes are
org.apache.commons.lang.math.DoubleRange
org.apache.commons.lang.math.FloatRange
org.apache.commons.lang.math.IntRange
org.apache.commons.lang.math.LongRange
org.apache.commons.lang.math.NumberRange
org.apache.commons.lang.math.Range
Possible fix: calculate the hash on a temporary variable and finally assign it to the member
> Possible race-conditions in hashCode of the range classes
> ---------------------------------------------------------
>
> Key: LANG-481
> URL: https://issues.apache.org/jira/browse/LANG-481
> Project: Commons Lang
> Issue Type: Bug
> Affects Versions: 2.4
> Reporter: Boris
> Priority: Minor
>
> The hashCode() methods of the range classes look very suspicious to me. The value is lazily initialized, but the calculation is done _on the cached value. With some unlucky timing a caller may get an incomplete hash.
> An unlucky sequence of Code could be something like
> T1: if (hashCode == 0)
> T1: hashCode = 17;
> T2: if (hashCode == 0)
> T2: return hashCode;
> T1: hashCode = 37 * hashCode...........
> where T1 and T2 are different threads accessing the method in parallel and T2 gets the wrong hash "17".
> Affected classes are
> org.apache.commons.lang.math.DoubleRange
> org.apache.commons.lang.math.FloatRange
> org.apache.commons.lang.math.IntRange
> org.apache.commons.lang.math.LongRange
> org.apache.commons.lang.math.NumberRange
> org.apache.commons.lang.math.Range
> Possible fix: calculate the hash on a temporary variable and finally assign it to the member
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.