/hg/icedtea8-forest/jdk: 2 new changesets

andrew at icedtea.classpath.org andrew at icedtea.classpath.org
Fri Jun 26 16:34:49 UTC 2015


changeset ad88ac6bac57 in /hg/icedtea8-forest/jdk
details: http://icedtea.classpath.org/hg/icedtea8-forest/jdk?cmd=changeset;node=ad88ac6bac57
author: kizune
date: Thu Jun 19 18:07:02 2014 +0400

	8000650, PR2462: unpack200.exe should check gzip crc
	Reviewed-by: ksrini


changeset d64c0a9b8b5a in /hg/icedtea8-forest/jdk
details: http://icedtea.classpath.org/hg/icedtea8-forest/jdk?cmd=changeset;node=d64c0a9b8b5a
author: mikael
date: Fri Jun 26 17:33:36 2015 +0100

	8074839, PR2462: Resolve disabled warnings for libunpack and the unpack200 binary
	Reviewed-by: dholmes, ksrini


diffstat:

 src/share/native/com/sun/java/util/jar/pack/bytes.h    |    2 +-
 src/share/native/com/sun/java/util/jar/pack/jni.cpp    |    5 +-
 src/share/native/com/sun/java/util/jar/pack/main.cpp   |   65 ++++++---
 src/share/native/com/sun/java/util/jar/pack/unpack.cpp |   50 ++++---
 src/share/native/com/sun/java/util/jar/pack/unpack.h   |    3 +-
 src/share/native/com/sun/java/util/jar/pack/utils.cpp  |    2 +-
 src/share/native/com/sun/java/util/jar/pack/zip.cpp    |    8 +-
 src/share/native/com/sun/java/util/jar/pack/zip.h      |    4 +-
 test/tools/pack200/PackChecksum.java                   |  107 +++++++++++++++++
 9 files changed, 191 insertions(+), 55 deletions(-)

diffs (475 lines):

diff -r f0137fa5ba52 -r d64c0a9b8b5a src/share/native/com/sun/java/util/jar/pack/bytes.h
--- a/src/share/native/com/sun/java/util/jar/pack/bytes.h	Thu Apr 23 13:48:02 2015 -0400
+++ b/src/share/native/com/sun/java/util/jar/pack/bytes.h	Fri Jun 26 17:33:36 2015 +0100
@@ -63,7 +63,7 @@
     bytes res;
     res.ptr = ptr + beg;
     res.len = end - beg;
-    assert(res.len == 0 || inBounds(res.ptr) && inBounds(res.limit()-1));
+    assert(res.len == 0 || (inBounds(res.ptr) && inBounds(res.limit()-1)));
     return res;
   }
   // building C strings inside byte buffers:
diff -r f0137fa5ba52 -r d64c0a9b8b5a src/share/native/com/sun/java/util/jar/pack/jni.cpp
--- a/src/share/native/com/sun/java/util/jar/pack/jni.cpp	Thu Apr 23 13:48:02 2015 -0400
+++ b/src/share/native/com/sun/java/util/jar/pack/jni.cpp	Fri Jun 26 17:33:36 2015 +0100
@@ -292,7 +292,7 @@
 
   if (uPtr->aborting()) {
     THROW_IOE(uPtr->get_abort_message());
-    return false;
+    return null;
   }
 
   // We have fetched all the files.
@@ -310,7 +310,7 @@
 JNIEXPORT jlong JNICALL
 Java_com_sun_java_util_jar_pack_NativeUnpack_finish(JNIEnv *env, jobject pObj) {
   unpacker* uPtr = get_unpacker(env, pObj, false);
-  CHECK_EXCEPTION_RETURN_VALUE(uPtr, NULL);
+  CHECK_EXCEPTION_RETURN_VALUE(uPtr, 0);
   size_t consumed = uPtr->input_consumed();
   free_unpacker(env, pObj, uPtr);
   return consumed;
@@ -320,6 +320,7 @@
 Java_com_sun_java_util_jar_pack_NativeUnpack_setOption(JNIEnv *env, jobject pObj,
                                        jstring pProp, jstring pValue) {
   unpacker*   uPtr  = get_unpacker(env, pObj);
+  CHECK_EXCEPTION_RETURN_VALUE(uPtr, false);
   const char* prop  = env->GetStringUTFChars(pProp, JNI_FALSE);
   CHECK_EXCEPTION_RETURN_VALUE(prop, false);
   const char* value = env->GetStringUTFChars(pValue, JNI_FALSE);
diff -r f0137fa5ba52 -r d64c0a9b8b5a src/share/native/com/sun/java/util/jar/pack/main.cpp
--- a/src/share/native/com/sun/java/util/jar/pack/main.cpp	Thu Apr 23 13:48:02 2015 -0400
+++ b/src/share/native/com/sun/java/util/jar/pack/main.cpp	Fri Jun 26 17:33:36 2015 +0100
@@ -62,6 +62,13 @@
     return unpacker::run(argc, argv);
 }
 
+// Dealing with big-endian arch
+#ifdef _BIG_ENDIAN
+#define SWAP_INT(a) (((a>>24)&0xff) | ((a<<8)&0xff0000) | ((a>>8)&0xff00) | ((a<<24)&0xff000000))
+#else
+#define SWAP_INT(a) (a)
+#endif
+
 // Single-threaded, implementation, not reentrant.
 // Includes a weak error check against MT access.
 #ifndef THREAD_SELF
@@ -142,31 +149,28 @@
   return progname;
 }
 
-static const char* usage_lines[] = {
-  "Usage:  %s [-opt... | --option=value]... x.pack[.gz] y.jar\n",
-    "\n",
-    "Unpacking Options\n",
-    "  -H{h}, --deflate-hint={h}     override transmitted deflate hint: true, false, or keep (default)\n",
-    "  -r, --remove-pack-file        remove input file after unpacking\n",
-    "  -v, --verbose                 increase program verbosity\n",
-    "  -q, --quiet                   set verbosity to lowest level\n",
-    "  -l{F}, --log-file={F}         output to the given log file, or '-' for standard output (default)\n",
-    "  -?, -h, --help                print this message\n",
-    "  -V, --version                 print program version\n",
-    "  -J{X}                         Java VM argument (ignored)\n",
-    null
-};
+#define USAGE_HEADER "Usage:  %s [-opt... | --option=value]... x.pack[.gz] y.jar\n"
+#define USAGE_OPTIONS \
+    "\n" \
+    "Unpacking Options\n" \
+    "  -H{h}, --deflate-hint={h}     override transmitted deflate hint: true, false, or keep (default)\n" \
+    "  -r, --remove-pack-file        remove input file after unpacking\n" \
+    "  -v, --verbose                 increase program verbosity\n" \
+    "  -q, --quiet                   set verbosity to lowest level\n" \
+    "  -l{F}, --log-file={F}         output to the given log file, or '-' for standard output (default)\n" \
+    "  -?, -h, --help                print this message\n" \
+    "  -V, --version                 print program version\n" \
+    "  -J{X}                         Java VM argument (ignored)\n"
 
 static void usage(unpacker* u, const char* progname, bool full = false) {
   // WinMain does not set argv[0] to the progrname
   progname = (progname != null) ? nbasename(progname) : "unpack200";
-  for (int i = 0; usage_lines[i] != null; i++) {
-    fprintf(u->errstrm, usage_lines[i], progname);
-    if (!full) {
-      fprintf(u->errstrm,
-              "(For more information, run %s --help .)\n", progname);
-      break;
-    }
+
+  fprintf(u->errstrm, USAGE_HEADER, progname);
+  if (full) {
+    fprintf(u->errstrm, USAGE_OPTIONS);
+  } else {
+    fprintf(u->errstrm, "(For more information, run %s --help .)\n", progname);
   }
 }
 
@@ -385,6 +389,7 @@
       u.start();
     }
   } else {
+    u.gzcrc = 0;
     u.start(peek, sizeof(peek));
   }
 
@@ -425,7 +430,23 @@
     status = 1;
   }
 
-  if (u.infileptr != null) {
+  if (!u.aborting() && u.infileptr != null) {
+    if (u.gzcrc != 0) {
+      // Read the CRC information from the gzip container
+      fseek(u.infileptr, -8, SEEK_END);
+      uint filecrc;
+      fread(&filecrc, sizeof(filecrc), 1, u.infileptr);
+      if (u.gzcrc != SWAP_INT(filecrc)) { // CRC error
+        if (strcmp(destination_file, "-") != 0) {
+          // Output is not stdout, remove it, it's broken
+          if (u.jarout != null)
+            u.jarout->closeJarFile(false);
+          remove(destination_file);
+        }
+        // Print out the error and exit with return code != 0
+        u.abort("CRC error, invalid compressed data.");
+      }
+    }
     fclose(u.infileptr);
     u.infileptr = null;
   }
diff -r f0137fa5ba52 -r d64c0a9b8b5a src/share/native/com/sun/java/util/jar/pack/unpack.cpp
--- a/src/share/native/com/sun/java/util/jar/pack/unpack.cpp	Thu Apr 23 13:48:02 2015 -0400
+++ b/src/share/native/com/sun/java/util/jar/pack/unpack.cpp	Fri Jun 26 17:33:36 2015 +0100
@@ -222,9 +222,9 @@
   }
 
 #ifdef PRODUCT
-  char* string() { return 0; }
+  const char* string() { return NULL; }
 #else
-  char* string();  // see far below
+  const char* string();  // see far below
 #endif
 };
 
@@ -715,13 +715,13 @@
   // Now we can size the whole archive.
   // Read everything else into a mega-buffer.
   rp = hdr.rp;
-  int header_size_0 = (int)(rp - input.base()); // used-up header (4byte + 3int)
-  int header_size_1 = (int)(rplimit - rp);      // buffered unused initial fragment
-  int header_size   = header_size_0+header_size_1;
+  size_t header_size_0 = (rp - input.base()); // used-up header (4byte + 3int)
+  size_t header_size_1 = (rplimit - rp);      // buffered unused initial fragment
+  size_t header_size   = header_size_0 + header_size_1;
   unsized_bytes_read = header_size_0;
   CHECK;
   if (foreign_buf) {
-    if (archive_size > (size_t)header_size_1) {
+    if (archive_size > header_size_1) {
       abort("EOF reading fixed input buffer");
       return;
     }
@@ -735,7 +735,7 @@
       return;
     }
     input.set(U_NEW(byte, add_size(header_size_0, archive_size, C_SLOP)),
-              (size_t) header_size_0 + archive_size);
+              header_size_0 + archive_size);
     CHECK;
     assert(input.limit()[0] == 0);
     // Move all the bytes we read initially into the real buffer.
@@ -958,13 +958,13 @@
   nentries = next_entry;
 
   // place a limit on future CP growth:
-  int generous = 0;
+  size_t generous = 0;
   generous = add_size(generous, u->ic_count); // implicit name
   generous = add_size(generous, u->ic_count); // outer
   generous = add_size(generous, u->ic_count); // outer.utf8
   generous = add_size(generous, 40); // WKUs, misc
   generous = add_size(generous, u->class_count); // implicit SourceFile strings
-  maxentries = add_size(nentries, generous);
+  maxentries = (uint)add_size(nentries, generous);
 
   // Note that this CP does not include "empty" entries
   // for longs and doubles.  Those are introduced when
@@ -982,8 +982,9 @@
   }
 
   // Initialize *all* our entries once
-  for (int i = 0 ; i < maxentries ; i++)
+  for (uint i = 0 ; i < maxentries ; i++) {
     entries[i].outputIndex = REQUESTED_NONE;
+  }
 
   initGroupIndexes();
   // Initialize hashTab to a generous power-of-two size.
@@ -3676,21 +3677,22 @@
 
 unpacker* debug_u;
 
-static bytes& getbuf(int len) {  // for debugging only!
+static bytes& getbuf(size_t len) {  // for debugging only!
   static int bn = 0;
   static bytes bufs[8];
   bytes& buf = bufs[bn++ & 7];
-  while ((int)buf.len < len+10)
+  while (buf.len < len + 10) {
     buf.realloc(buf.len ? buf.len * 2 : 1000);
+  }
   buf.ptr[0] = 0;  // for the sake of strcat
   return buf;
 }
 
-char* entry::string() {
+const char* entry::string() {
   bytes buf;
   switch (tag) {
   case CONSTANT_None:
-    return (char*)"<empty>";
+    return "<empty>";
   case CONSTANT_Signature:
     if (value.b.ptr == null)
       return ref(0)->string();
@@ -3710,26 +3712,28 @@
     break;
   default:
     if (nrefs == 0) {
-      buf = getbuf(20);
-      sprintf((char*)buf.ptr, TAG_NAME[tag]);
+      return TAG_NAME[tag];
     } else if (nrefs == 1) {
       return refs[0]->string();
     } else {
-      char* s1 = refs[0]->string();
-      char* s2 = refs[1]->string();
-      buf = getbuf((int)strlen(s1) + 1 + (int)strlen(s2) + 4 + 1);
+      const char* s1 = refs[0]->string();
+      const char* s2 = refs[1]->string();
+      buf = getbuf(strlen(s1) + 1 + strlen(s2) + 4 + 1);
       buf.strcat(s1).strcat(" ").strcat(s2);
       if (nrefs > 2)  buf.strcat(" ...");
     }
   }
-  return (char*)buf.ptr;
+  return (const char*)buf.ptr;
 }
 
 void print_cp_entry(int i) {
   entry& e = debug_u->cp.entries[i];
-  char buf[30];
-  sprintf(buf, ((uint)e.tag < CONSTANT_Limit)? TAG_NAME[e.tag]: "%d", e.tag);
-  printf(" %d\t%s %s\n", i, buf, e.string());
+
+  if ((uint)e.tag < CONSTANT_Limit) {
+    printf(" %d\t%s %s\n", i, TAG_NAME[e.tag], e.string());
+  } else {
+    printf(" %d\t%d %s\n", i, e.tag, e.string());
+  }
 }
 
 void print_cp_entries(int beg, int end) {
diff -r f0137fa5ba52 -r d64c0a9b8b5a src/share/native/com/sun/java/util/jar/pack/unpack.h
--- a/src/share/native/com/sun/java/util/jar/pack/unpack.h	Thu Apr 23 13:48:02 2015 -0400
+++ b/src/share/native/com/sun/java/util/jar/pack/unpack.h	Fri Jun 26 17:33:36 2015 +0100
@@ -171,6 +171,7 @@
   bytes inbytes;    // direct
   gunzip* gzin;     // gunzip filter, if any
   jar*  jarout;     // output JAR file
+  uint  gzcrc;      // CRC gathered from gzip content
 
 #ifndef PRODUCT
   int   nowrite;
@@ -209,7 +210,7 @@
   byte*     rp;          // read pointer (< rplimit <= input.limit())
   byte*     rplimit;     // how much of the input block has been read?
   julong    bytes_read;
-  int       unsized_bytes_read;
+  size_t    unsized_bytes_read;
 
   // callback to read at least one byte, up to available input
   typedef jlong (*read_input_fn_t)(unpacker* self, void* buf, jlong minlen, jlong maxlen);
diff -r f0137fa5ba52 -r d64c0a9b8b5a src/share/native/com/sun/java/util/jar/pack/utils.cpp
--- a/src/share/native/com/sun/java/util/jar/pack/utils.cpp	Thu Apr 23 13:48:02 2015 -0400
+++ b/src/share/native/com/sun/java/util/jar/pack/utils.cpp	Fri Jun 26 17:33:36 2015 +0100
@@ -81,7 +81,7 @@
 int assert_failed(const char* p) {
   char message[1<<12];
   sprintf(message, "@assert failed: %s\n", p);
-  fprintf(stdout, 1+message);
+  fprintf(stdout, "%s", 1+message);
   breakpoint();
   unpack_abort(message);
   return 0;
diff -r f0137fa5ba52 -r d64c0a9b8b5a src/share/native/com/sun/java/util/jar/pack/zip.cpp
--- a/src/share/native/com/sun/java/util/jar/pack/zip.cpp	Thu Apr 23 13:48:02 2015 -0400
+++ b/src/share/native/com/sun/java/util/jar/pack/zip.cpp	Fri Jun 26 17:33:36 2015 +0100
@@ -84,7 +84,7 @@
 }
 
 // Write data to the ZIP output stream.
-void jar::write_data(void* buff, int len) {
+void jar::write_data(void* buff, size_t len) {
   while (len > 0) {
     int rc = (int)fwrite(buff, 1, len, jarfp);
     if (rc <= 0) {
@@ -323,12 +323,12 @@
     // Total number of disks (int)
     header64[36] = (ushort)SWAP_BYTES(1);
     header64[37] = 0;
-    write_data(header64, (int)sizeof(header64));
+    write_data(header64, sizeof(header64));
   }
 
   // Write the End of Central Directory structure.
   PRINTCR((2, "end-of-directory at %d\n", output_file_offset));
-  write_data(header, (int)sizeof(header));
+  write_data(header, sizeof(header));
 
   PRINTCR((2, "writing zip comment\n"));
   // Write the comment.
@@ -551,6 +551,7 @@
       break;
     }
     int nr = readlen - zs.avail_out;
+    u->gzcrc = crc32(u->gzcrc, (const unsigned char *)bufptr, nr);
     numread += nr;
     bufptr += nr;
     assert(numread <= maxlen);
@@ -589,6 +590,7 @@
   zstream = NEW(z_stream, 1);
   u->gzin = this;
   u->read_input_fn = read_input_via_gzip;
+  u->gzcrc = crc32(0, Z_NULL, 0);
 }
 
 void gunzip::start(int magic) {
diff -r f0137fa5ba52 -r d64c0a9b8b5a src/share/native/com/sun/java/util/jar/pack/zip.h
--- a/src/share/native/com/sun/java/util/jar/pack/zip.h	Thu Apr 23 13:48:02 2015 -0400
+++ b/src/share/native/com/sun/java/util/jar/pack/zip.h	Fri Jun 26 17:33:36 2015 +0100
@@ -68,8 +68,8 @@
   }
 
   // Private Methods
-  void write_data(void* ptr, int len);
-  void write_data(bytes& b) { write_data(b.ptr, (int)b.len); }
+  void write_data(void* ptr, size_t len);
+  void write_data(bytes& b) { write_data(b.ptr, b.len); }
   void add_to_jar_directory(const char* fname, bool store, int modtime,
                             int len, int clen, uLong crc);
   void write_jar_header(const char* fname, bool store, int modtime,
diff -r f0137fa5ba52 -r d64c0a9b8b5a test/tools/pack200/PackChecksum.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/tools/pack200/PackChecksum.java	Fri Jun 26 17:33:36 2015 +0100
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+
+/*
+ * @test
+ * @bug 8000650
+ * @summary unpack200.exe should check gzip crc
+ * @compile -XDignore.symbol.file Utils.java PackChecksum.java
+ * @run main PackChecksum
+ * @author kizune
+ */
+public class PackChecksum {
+
+    public static void main(String... args) throws Exception {
+        testChecksum();
+    }
+
+    static void testChecksum() throws Exception {
+
+        // Create a fresh .jar file
+        File testFile = new File("src_tools.jar");
+        File testPack = new File("src_tools.pack.gz");
+        generateJar(testFile);
+        List<String> cmdsList = new ArrayList<>();
+
+        // Create .pack file
+        cmdsList.add(Utils.getPack200Cmd());
+        cmdsList.add(testPack.getName());
+        cmdsList.add(testFile.getName());
+        Utils.runExec(cmdsList);
+
+        // Mess up with the checksum of the packed file
+        RandomAccessFile raf = new RandomAccessFile(testPack, "rw");
+        raf.seek(raf.length() - 8);
+        int val = raf.readInt();
+        val = Integer.MAX_VALUE - val;
+        raf.seek(raf.length() - 8);
+        raf.writeInt(val);
+        raf.close();
+
+        File dstFile = new File("dst_tools.jar");
+        cmdsList.clear();
+        cmdsList.add(Utils.getUnpack200Cmd());
+        cmdsList.add(testPack.getName());
+        cmdsList.add(dstFile.getName());
+
+        boolean passed = false;
+        try {
+            Utils.runExec(cmdsList);
+        } catch (RuntimeException re) {
+            // unpack200 should exit with non-zero exit code
+            passed = true;
+        }
+
+        // tidy up
+        if (testFile.exists()) testFile.delete();
+        if (testPack.exists()) testPack.delete();
+        if (dstFile.exists()) dstFile.delete();
+        if (!passed) {
+            throw new Exception("File with incorrect CRC unpacked without the error.");
+        }
+    }
+
+    static void generateJar(File result) throws IOException {
+        if (result.exists()) {
+            result.delete();
+        }
+
+        try (JarOutputStream output = new JarOutputStream(new FileOutputStream(result)); ) {
+            for (int i = 0 ; i < 100 ; i++) {
+                JarEntry e = new JarEntry("F-" + i + ".txt");
+                output.putNextEntry(e);
+            }
+            output.flush();
+            output.close();
+        }
+    }
+
+}


More information about the distro-pkg-dev mailing list