RFR : 8038491: Improve synchronization in ZipFile.read()

Xueming Shen xueming.shen at oracle.com
Tue Apr 8 17:57:22 UTC 2014


On 4/8/14 10:29 AM, Seán Coffey wrote:
> Sherman,
>
> I see rem == 0 condition becoming true before the zentry variable is 
> set to 0 (in close()) - in a multi threaded scenario like this one, we 
> could have zero remaining bytes in zentry and yet have a zentry != 0 - 
> your suggestion would prevent the SEGV (since we're in the sync block) 
> but we would needlessly cycle into the ensureOpenOrZipException() and 
> ZipFile.read code (line 713) if another thread tasked with the close() 
> call was knocked off by the dispatcher during the various rem == 0 
> checks that we make : e.g
>
>  722             if (rem == 0) {
>  723                 close();
>  724             }
>
> Am I reading this correctly ?
>
My take is that the performance is not a concern here, the only real 
problem is the SEGV.
Given "num" is not a volatile and is not updated under synchronized 
block,  check "num == 0"
is not going to make ZFIS work for mult-thread usage. It also makes me 
nervous to check it
inside the synchronized block as a global "flag". I'm also concerned 
that the change to check
the rem == 0 after the check of "len" may also change the behavior of 
someone's code in
certain circumstance...

-Sherman

> regards,
> Sean.
>
> On 08/04/2014 16:59, Xueming Shen wrote:
>> Hi Sean,
>>
>> It might be more explicit to check "if (zentry == 0)" here?
>>
>> -Sherman
>>
>> On 4/8/14 8:21 AM, Seán Coffey wrote:
>>> A recently reported bug shows a race condition is possible on the 
>>> rem == 0 check in ZipFile.read(byte b[], int off, int len). A bad 
>>> check can result in referencing a jzentry structure that might 
>>> already be freed and hence result in a SEGV. The fix is trivial and 
>>> involves moving the rem == 0 check into a synchronized block. The 
>>> ZipFile API itself is not thread safe so having mutiple threads 
>>> operate on the same ZipFileInputStream is something that should 
>>> never be performed.
>>>
>>> webrev : http://cr.openjdk.java.net/~coffeys/webrev.8038491/webrev/
>>>
>>> regards,
>>> Sean.
>>
>




More information about the core-libs-dev mailing list