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.

Thanks
Max

p.s. I am writing a test and notice this.

   349  
   350                  StringBuffer buffer = new StringBuffer(name);
   351                  buffer.append(": ");
   352  
   353                  String value = (String) e.getValue();
   354                  if (value != null) {
   355                      byte[] vb = value.getBytes("UTF8");
   356                      value = new String(vb, 0, 0, vb.length);
   357                  }
   358                  buffer.append(value);
   359  
   360                  buffer.append("\r\n");
   361                  Manifest.make72Safe(buffer);
   362                  out.writeBytes(buffer.toString());
   363              }
   364          }
   365          out.writeBytes("\r\n");
   366      }

Reply via email to