Hi David,

    The current implementation uses static char array to keep the error
message, so it is possible when two errors happen at the same time, the
error message will be modified. I have a testcase attached in
http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-April/009766.html .

    So in the patch, the static char array is modified to on stack char
array to avoid the race in error case; and strdup is called because the
error message is currently kept on stack. But I didn't notice the case that
strdup might fail.

On Wed, Apr 18, 2012 at 10:43 AM, David Holmes <david.hol...@oracle.com>wrote:

> Hi Sean,
>
>
> On 18/04/2012 12:37 PM, Sean Chou wrote:
>
>>     To free the error string in ZIP_Open is a result of discussion with
>> hotspot. They said the error string is never used and they do not want
>> to do the free work in hotspot for ZIP_Open...
>>
>
> Ok. I assume there are no other callers of this method.
>
>
>      strdup would cause a NULL error string if memory allocation is
>> failed. If strdup is not used, another choice may be asking the caller
>> to reserve the space for error string. Caller can reserve the space on
>> stack, so *pmsg can still be set to NULL in ZIP_Put_In_Cache0 and caller
>> can keep the code for error handling. But this is also strange. Do you
>> have any better solutions?
>>
>
> I'm still unclear why the strdup is being used on string literals. Are we
> concerned with someone modifying the contents of the string literals?
>
>
>      It will not cause SEGV, there are NULL checks before free.
>>
>
> It is not the free that I'm worried about. If an error occurs but the
> strdup fails due to a malloc failure then the caller may reference the msg.
> Previously this msg was never NULL but now it may be.
>
> David
> -----
>
>  On Tue, Apr 17, 2012 at 10:48 AM, David Holmes <david.hol...@oracle.com
>> <mailto:david.holmes@oracle.**com <david.hol...@oracle.com>>> wrote:
>>
>>    Certainly the string management in this code is a bit of a mess, but
>>    I don't understand why the strdup's of string literals have been
>>    introduced. Even if for a good reason this seems to imply that an
>>    allocation failure will result in a NULL where before the caller was
>>    guaranteed never to get NULL in the error case, and that could lead
>>    to SEGV.
>>
>>    Also with the change to avoid changes on the hotspot side, the
>>    actual cause of the open failure has been lost in ZIP_Open
>>
>>    David
>>
>>
>>    On 13/04/2012 1:14 AM, Sean Chou wrote:
>>
>>        Hi Alan,
>>
>>             I made a new webrev, added the comments and the 2 other
>>        modification.
>>        It's now :
>>        
>> http://cr.openjdk.java.net/~__**zhouyx/7159982/webrev.02/<http://cr.openjdk.java.net/~__zhouyx/7159982/webrev.02/>
>>
>>        
>> <http://cr.openjdk.java.net/~**zhouyx/7159982/webrev.02/<http://cr.openjdk.java.net/~zhouyx/7159982/webrev.02/>
>> >
>>
>>        On Thu, Apr 12, 2012 at 4:24 PM, Alan
>>        Bateman<Alan.Bateman@oracle.__**com
>>        <mailto:Alan.Bateman@oracle.**com <alan.bate...@oracle.com>
>> >>wrote:
>>
>>
>>            On 12/04/2012 06:40, Sean Chou wrote:
>>
>>                Hi Alan,
>>
>>                    Many thanks.
>>
>>                    I updated the patch, ZIP_Open frees the error
>>                message and set "Zip
>>                file open error".
>>
>>                The new webrev is : http://cr.openjdk.java.net/~**
>>                zhouyx/7159982/webrev.01/<**http__://cr.openjdk.java.net/%
>> **__7Ezhouyx/7159982/webrev.01/
>>                
>> <http://cr.openjdk.java.net/%**7Ezhouyx/7159982/webrev.01/<http://cr.openjdk.java.net/%7Ezhouyx/7159982/webrev.01/>
>> >><
>>                http://cr.openjdk.java.net/%****
>> __7Ezhouyx/7159982/webrev.01/
>>                <http://cr.openjdk.java.net/%***
>> *7Ezhouyx/7159982/webrev.01/><**ht__tp://cr.openjdk.java.net/%**
>> __7Ezhouyx/7159982/webrev.01/
>>
>>                
>> <http://cr.openjdk.java.net/%**7Ezhouyx/7159982/webrev.01/<http://cr.openjdk.java.net/%7Ezhouyx/7159982/webrev.01/>
>> >>
>>
>>
>>
>>
>>                    Please take a look once more.
>>
>>            This looks much better. I think we'll need to add comments
>>            to the ZIP_*
>>            functions so that it's clear to anyone using them when they
>>            need to free
>>            the error message and then they don't.
>>
>>            One implementation nit at zip_util.c L876 where it should
>>            check if pmsg is
>>            NULL and I think the tests should be reversed so that its:
>>
>>            if (file != NULL&&  pmsg != NULL&&  *pmsg != NULL)  { ... }
>>
>>
>>            One other minor nit is L875 where there is a space on either
>>            side of the
>>            "*", best to keep the style consistent.
>>
>>            -Alan.
>>
>>
>>
>>
>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>>
>>


-- 
Best Regards,
Sean Chou

Reply via email to