> On Jan 30, 2018, at 8:57 AM, mandy chung <mandy.ch...@oracle.com> wrote:
> 
> 
> 
> On 1/29/18 4:22 PM, Weijun Wang wrote:
>> Ping again.
>> 
>> 
>>> On Jan 22, 2018, at 1:12 PM, Weijun Wang <weijun.w...@oracle.com>
>>>  wrote:
>>> 
>>> src/java.base/share/classes/java/util/jar/Attributes.java:
>>> 
>>>   329           @SuppressWarnings("deprecation")
>>>   330           void writeMain(DataOutputStream out) throws IOException
>>>   331           {
>>>   332               // write out the *-Version header first, if it exists
>>>   333               String vername = Name.MANIFEST_VERSION.toString();
>>>   334               String version = getValue(vername);
>>>   335               if (version == null) {
>>>   336                   vername = Name.SIGNATURE_VERSION.toString();
>>>   337                   version = getValue(vername);
>>>   338               }
>>>   339       
>>>   340               if (version != null) {
>>>   341                   out.writeBytes(vername+": "+version+"\r\n");
>>>   342               }
>>>   343       
>>>   344               // write out all attributes except for the version
>>>   345               // we wrote out earlier
>>>   346               for (Entry<Object, Object> e : entrySet()) {
>>>   347                   String name = ((Name) e.getKey()).toString();
>>>   348                   if ((version != null) && 
>>> !(name.equalsIgnoreCase(vername))) {
>>> 
>>> So, if there is no existing MANIFEST_VERSION or SIGNATURE_VERSION, then 
>>> version is null and the check above will be false for ever and any other 
>>> attribute cannot be written out.
>>> 
>>> Is this intended? If so, we can exit with an else block after line 342.
>>> 
> 
> From code inspection, I agree that this method is a nop if there is no 
> Manifest-Version attribute or Signature-Attribute.  This can return quickly 
> without iterating the entry set.   I don't see any issue to make it an else 
> block.

On the other hand, if this is not intended we should fix line 348 and remove 
the version != null check. I cannot find a place saying a MANIFEST_VERSION or 
SIGNATURE_VERSION must be provided. Even if so, this should be an error and 
it's not a good idea to silently drop all other attributes in the main section.

Anyway, I filed https://bugs.openjdk.java.net/browse/JDK-8196371.

--Max

> 
> This method is only called from Manifest::write method which does not mention 
> Signature-Version but I don't have the history to tell if this is intended or 
> not.
> 
> Mandy
> 
> 

Reply via email to