And post hoc looks fine to me as well.

Mike

> On Jan 21, 2015, at 12:43 PM, Peter Levart <peter.lev...@gmail.com> wrote:
> 
> Thanks Martin, Mike, Chris and Daniel,
> 
> This has been pushed.
> 
> Regards, Peter
> 
>> On 01/21/2015 05:44 PM, Martin Buchholz wrote:
>> Looks good to me!
>> 
>>> On Wed, Jan 21, 2015 at 5:04 AM, Peter           Levart 
>>> <peter.lev...@gmail.com> wrote:
>>> Hi Martin and others,
>>> 
>>> I have also modified the test per Martin's suggestion to factor out the 
>>> serialClone() method. Here's the latest webrev:
>>> 
>>> http://cr.openjdk.java.net/~plevart/jdk9-dev/Hashtable.8068427/webrev.03/
>>> 
>>> Is this ok now?
>>> 
>>> Regards, Peter
>>> 
>>> 
>>>> On 01/09/2015 11:16 AM, Peter Levart wrote:
>>>>> On 01/05/2015 05:52 PM, Mike Duigou wrote:
>>>>> Well spotted Peter. The change looks good though I wonder if it should be:
>>>>> 
>>>>> int length = (int)((elements + elements / 20) / loadFactor) + 3;
>>>>> 
>>>>> FYI, regarding Daniel's suggestion: When similar invariant checks were 
>>>>> added to the HashMap deserialization method we found code which relied 
>>>>> upon the illegal values. In some cases the serialized HashMaps were 
>>>>> created by alternative serialization implementations which included 
>>>>> illegal, but until the checks were added, "harmless" values.
>>>>> 
>>>>> The invariant checks should still be added though. It might even be worth 
>>>>> adding checks that the other deserialized values are in valid ranges.
>>>>> 
>>>>> Mike
>>>> 
>>>> Hi Mike and others,
>>>> 
>>>> Yes, your suggested length computation is more in "spirit" with the 
>>>> comment above that states: "Compute new length with a bit of room 5% to 
>>>> grow...", since it takes loadFactor into account for that additional 5% 
>>>> too. I changed it to your suggested expression.
>>>> 
>>>> Here's new webrev:
>>>> 
>>>> http://cr.openjdk.java.net/~plevart/jdk9-dev/Hashtable.8068427/webrev.02/
>>>> 
>>>> In addition to valid loadFactor, # of elements is checked to be 
>>>> non-negative. The original length is just "repaired" if it appears to be 
>>>> less than the enforced auto-growth invariant of Hashtable.
>>>> 
>>>> I also expanded the test to exercise more combinations of # of elements 
>>>> and loadFactor. Here's what gets printed with current Hashtable 
>>>> implementation:
>>>> 
>>>>                  ser.  deser.
>>>>    size  load  lentgh  length       valid range ok?
>>>> ------- ----- ------- ------- ----------------- ------
>>>>      10  0.15     127       4      67...    134 NOT-OK
>>>>      10  0.50      31       8      21...     42 NOT-OK
>>>>      10  0.75      15      10      14...     28 NOT-OK
>>>>      10  1.00      15      13      11...     22 OK
>>>>      10  2.50       7       7       5...     10 OK
>>>>      50  0.15     511      12     334...    668 NOT-OK
>>>>      50  0.50     127      30     101...    202 NOT-OK
>>>>      50  0.75     127      42      67...    134 NOT-OK
>>>>      50  1.00      63      55      51...    102 OK
>>>>      50  2.50      31      31      21...     42 OK
>>>>     500  0.15    4095     103    3334...   6668 NOT-OK
>>>>     500  0.50    1023     278    1001...   2002 NOT-OK
>>>>     500  0.75    1023     403     667...   1334 NOT-OK
>>>>     500  1.00     511     511     501...   1002 OK
>>>>     500  2.50     255     255     201...    402 OK
>>>>    5000  0.15   65535    1003   33334...  66668 NOT-OK
>>>>    5000  0.50   16383    2753   10001...  20002 NOT-OK
>>>>    5000  0.75    8191    4003    6667...  13334 NOT-OK
>>>>    5000  1.00    8191    5253    5001...  10002 OK
>>>>    5000  2.50    2047    2047    2001...   4002 OK
>>>> 
>>>> 
>>>> With patched Hashtable, the test passes:
>>>> 
>>>>                  ser.  deser.
>>>>    size  load  lentgh  length       valid range ok?
>>>> ------- ----- ------- ------- ----------------- ------
>>>>      10  0.15     127      69      67...    134 OK
>>>>      10  0.50      31      23      21...     42 OK
>>>>      10  0.75      15      15      14...     28 OK
>>>>      10  1.00      15      13      11...     22 OK
>>>>      10  2.50       7       7       5...     10 OK
>>>>      50  0.15     511     349     334...    668 OK
>>>>      50  0.50     127     107     101...    202 OK
>>>>      50  0.75     127      71      67...    134 OK
>>>>      50  1.00      63      55      51...    102 OK
>>>>      50  2.50      31      23      21...     42 OK
>>>>     500  0.15    4095    3501    3334...   6668 OK
>>>>     500  0.50    1023    1023    1001...   2002 OK
>>>>     500  0.75    1023     703     667...   1334 OK
>>>>     500  1.00     511     511     501...   1002 OK
>>>>     500  2.50     255     213     201...    402 OK
>>>>    5000  0.15   65535   35003   33334...  66668 OK
>>>>    5000  0.50   16383   10503   10001...  20002 OK
>>>>    5000  0.75    8191    7003    6667...  13334 OK
>>>>    5000  1.00    8191    5253    5001...  10002 OK
>>>>    5000  2.50    2047    2047    2001...   4002 OK
>>>> 
>>>> 
>>>> 
>>>> Regards, Peter
>>>> 
>>>>> 
>>>>>> On 2015-01-05 07:48, core-libs-dev-requ...@openjdk.java.net wrote:
>>>>>> 
>>>>>> Today's Topics:
>>>>>> 
>>>>>>    2. Re: RFR: JDK-8068427 Hashtable deserialization reconstitutes
>>>>>>       table    with wrong capacity (Daniel Fuchs)
>>>>> 
>>>>> 
>>>>>> Message: 2
>>>>>> Date: Mon, 05 Jan 2015 15:52:55 +0100
>>>>>> From: Daniel Fuchs <daniel.fu...@oracle.com>
>>>>>> To: Peter Levart <peter.lev...@gmail.com>, core-libs-dev
>>>>>>     <core-libs-dev@openjdk.java.net>
>>>>>> Subject: Re: RFR: JDK-8068427 Hashtable deserialization reconstitutes
>>>>>>     table    with wrong capacity
>>>>>> Message-ID: <54aaa547.8070...@oracle.com>
>>>>>> Content-Type: text/plain; charset=utf-8; format=flowed
>>>>>> 
>>>>>>> On 04/01/15 18:58, Peter Levart wrote:
>>>>>>> Hi,
>>>>>>> 
>>>>>>> While investigating the following issue:
>>>>>>> 
>>>>>>>      https://bugs.openjdk.java.net/browse/JDK-8029891
>>>>>>> 
>>>>>>> I noticed there's a bug in deserialization code of java.util.Hashtable
>>>>>>> (from day one probably):
>>>>>>> 
>>>>>>>      https://bugs.openjdk.java.net/browse/JDK-8068427
>>>>>>> 
>>>>>>> The fix is a trivial one-character replacement: '*' -> '/', but I also
>>>>>>> corrected some untruthful comments in the neighbourhood (which might
>>>>>>> have been true from day one, but are not any more):
>>>>>>> 
>>>>>>> http://cr.openjdk.java.net/~plevart/jdk9-dev/Hashtable.8068427/webrev.01/
>>>>>>>  
>>>>>> 
>>>>>> Hi Peter,
>>>>>> 
>>>>>> I wonder whether there should be a guard against loadFactor being
>>>>>> zero/negative/NaN after line 1173, like in the constructor e.g. as
>>>>>> in lines
>>>>>> 
>>>>>>   188         if (loadFactor <= 0 || Float.isNaN(loadFactor))
>>>>>>   189             throw new IllegalArgumentException("Illegal Load:
>>>>>> "+loadFactor);
>>>>>> 
>>>>>> if only to avoid division by zero.
>>>>>> 
>>>>>> best regards,
>>>>>> 
>>>>>> -- daniel
>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> Regards, Peter
> 

Reply via email to