/hg/icedtea6: Add backports destined for the next update, 1.13.9.
andrew at icedtea.classpath.org
andrew at icedtea.classpath.org
Mon Oct 12 04:50:38 UTC 2015
changeset f6d8c8e6b8cf in /hg/icedtea6
details: http://icedtea.classpath.org/hg/icedtea6?cmd=changeset;node=f6d8c8e6b8cf
author: Andrew John Hughes <gnu.andrew at redhat.com>
date: Mon Oct 12 05:50:22 2015 +0100
Add backports destined for the next update, 1.13.9.
S6440786, PR363: Cannot create a ZIP file containing zero entries
S6599383, PR363: Unable to open zip files more than 2GB in size
S6929479, PR363: Add a system property sun.zip.disableMemoryMapping to disable mmap use in ZipFile
S7105461, PR2662: Large JTables are not rendered correctly with Xrender pipeline
S7150134, PR2662: JCK api/java_awt/Graphics/index.html#DrawLine fails with OOM for jdk8 with XRender pipeline
PR2513: Reset success following calls in LayoutManager.cpp
2015-10-12 Andrew John Hughes <gnu.andrew at redhat.com>
* Makefile.am:
(ICEDTEA_PATCHES): Add new patches.
* NEWS: Updated.
* patches/openjdk/6440786-pr363-zero_entry_zips.patch,
* patches/openjdk/6599383-pr363-large_zip_files.patch,
* patches/openjdk/6929479-pr363-disable_mmap_zip.patch,
* patches/openjdk/7105461-pr2662-xrender_jtables.patch,
* patches/openjdk/7150134-pr2662-xrender_drawline_oom.patch,
* patches/pr2513-layoutengine_reset.patch:
New backports for issues to be fixed in 1.13.9.
diffstat:
ChangeLog | 13 +
Makefile.am | 10 +-
NEWS | 6 +
patches/openjdk/6440786-pr363-zero_entry_zips.patch | 237 ++++++++++
patches/openjdk/6599383-pr363-large_zip_files.patch | 214 +++++++++
patches/openjdk/6929479-pr363-disable_mmap_zip.patch | 331 ++++++++++++++
patches/openjdk/7105461-pr2662-xrender_jtables.patch | 117 ++++
patches/openjdk/7150134-pr2662-xrender_drawline_oom.patch | 51 ++
patches/pr2513-layoutengine_reset.patch | 22 +
9 files changed, 999 insertions(+), 2 deletions(-)
diffs (truncated from 1069 to 500 lines):
diff -r acc83d51b013 -r f6d8c8e6b8cf ChangeLog
--- a/ChangeLog Tue Aug 18 20:53:28 2015 +0100
+++ b/ChangeLog Mon Oct 12 05:50:22 2015 +0100
@@ -1,3 +1,16 @@
+2015-10-12 Andrew John Hughes <gnu.andrew at redhat.com>
+
+ * Makefile.am:
+ (ICEDTEA_PATCHES): Add new patches.
+ * NEWS: Updated.
+ * patches/openjdk/6440786-pr363-zero_entry_zips.patch,
+ * patches/openjdk/6599383-pr363-large_zip_files.patch,
+ * patches/openjdk/6929479-pr363-disable_mmap_zip.patch,
+ * patches/openjdk/7105461-pr2662-xrender_jtables.patch,
+ * patches/openjdk/7150134-pr2662-xrender_drawline_oom.patch,
+ * patches/pr2513-layoutengine_reset.patch:
+ New backports for issues to be fixed in 1.13.9.
+
2015-08-18 Andrew John Hughes <gnu.andrew at redhat.com>
* NEWS: Add 1.13.8 release notes.
diff -r acc83d51b013 -r f6d8c8e6b8cf Makefile.am
--- a/Makefile.am Tue Aug 18 20:53:28 2015 +0100
+++ b/Makefile.am Mon Oct 12 05:50:22 2015 +0100
@@ -642,7 +642,11 @@
patches/pr2460-policy_jar_timestamp.patch \
patches/pr2481_sysconfig_clock_spaces.patch \
patches/pr2486-768_dh.patch \
- patches/pr2488-1024_dh.patch
+ patches/pr2488-1024_dh.patch \
+ patches/openjdk/6440786-pr363-zero_entry_zips.patch \
+ patches/openjdk/6599383-pr363-large_zip_files.patch \
+ patches/openjdk/6929479-pr363-disable_mmap_zip.patch \
+ patches/pr2513-layoutengine_reset.patch
if WITH_RHINO
ICEDTEA_PATCHES += \
@@ -672,7 +676,9 @@
if ENABLE_XRENDER
ICEDTEA_PATCHES += patches/openjdk/6307603-xrender-01.patch \
patches/openjdk/6961633-xrender-02.patch \
- patches/openjdk/7018387-xrender_gc_leak.patch
+ patches/openjdk/7018387-xrender_gc_leak.patch \
+ patches/openjdk/7150134-pr2662-xrender_drawline_oom.patch \
+ patches/openjdk/7105461-pr2662-xrender_jtables.patch
endif
if ENABLE_SYSTEMTAP
diff -r acc83d51b013 -r f6d8c8e6b8cf NEWS
--- a/NEWS Tue Aug 18 20:53:28 2015 +0100
+++ b/NEWS Mon Oct 12 05:50:22 2015 +0100
@@ -15,16 +15,22 @@
New in release 1.14.0 (201X-XX-XX):
* Backports
+ - S6440786, PR363: Cannot create a ZIP file containing zero entries
+ - S6599383, PR363: Unable to open zip files more than 2GB in size
- S6611637: NullPointerException in sun.font.GlyphLayout$EngineRecord.init
- S6727719: Performance of TextLayout.getBounds()
- S6745225: Memory leak while drawing Attributed String
- S6904962: GlyphVector.getVisualBounds should not be affected by leading or trailing white space.
+ - S6929479, PR363: Add a system property sun.zip.disableMemoryMapping to disable mmap use in ZipFile
+ - S7105461, PR2662: Large JTables are not rendered correctly with Xrender pipeline
+ - S7150134, PR2662: JCK api/java_awt/Graphics/index.html#DrawLine fails with OOM for jdk8 with XRender pipeline
- S7151089: PS NUMA: NUMA allocator should not attempt to free pages when using SHM large pages
- S8013057: Detect mmap() commit failures in Linux and Solaris os::commit_memory() impls and call vm_exit_out_of_memory()
- S8026887: Make issues due to failed large pages allocations easier to debug
* Bug fixes
- PR1886: IcedTea does not checksum supplied tarballs
- PR2083: Add support for building Zero on AArch64
+ - PR2513: Reset success following calls in LayoutManager.cpp
New in release 1.13.8 (2015-07-29):
diff -r acc83d51b013 -r f6d8c8e6b8cf patches/openjdk/6440786-pr363-zero_entry_zips.patch
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/openjdk/6440786-pr363-zero_entry_zips.patch Mon Oct 12 05:50:22 2015 +0100
@@ -0,0 +1,237 @@
+# HG changeset patch
+# User bristor
+# Date 1221170337 25200
+# Thu Sep 11 14:58:57 2008 -0700
+# Node ID bee470ba5b243162ca0f84e49f794e94381876cd
+# Parent 3e7b9a0f3a6f40b1feb22990ed005e15e6ab6b5e
+6440786, PR363: Cannot create a ZIP file containing zero entries
+Summary: Allow reading and writing of ZIP files with zero entries.
+Reviewed-by: alanb
+
+diff -Nru openjdk.orig/jdk/src/share/classes/java/util/zip/ZipOutputStream.java openjdk/jdk/src/share/classes/java/util/zip/ZipOutputStream.java
+--- openjdk.orig/jdk/src/share/classes/java/util/zip/ZipOutputStream.java 2015-07-20 17:22:20.000000000 +0100
++++ openjdk/jdk/src/share/classes/java/util/zip/ZipOutputStream.java 2015-10-05 01:17:22.830735488 +0100
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1996, 2008, 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
+@@ -317,9 +317,6 @@
+ if (current != null) {
+ closeEntry();
+ }
+- if (xentries.size() < 1) {
+- throw new ZipException("ZIP file must have at least one entry");
+- }
+ // write central directory
+ long off = written;
+ for (XEntry xentry : xentries)
+diff -Nru openjdk.orig/jdk/src/share/native/java/util/zip/zip_util.c openjdk/jdk/src/share/native/java/util/zip/zip_util.c
+--- openjdk.orig/jdk/src/share/native/java/util/zip/zip_util.c 2015-07-20 17:22:14.000000000 +0100
++++ openjdk/jdk/src/share/native/java/util/zip/zip_util.c 2015-10-05 01:17:05.587024552 +0100
+@@ -730,16 +730,22 @@
+ }
+
+ len = zip->len = ZFILE_Lseek(zfd, 0, SEEK_END);
+- if (len == -1) {
+- if (pmsg && JVM_GetLastErrorString(errbuf, sizeof(errbuf)) > 0)
+- *pmsg = errbuf;
++ if (len <= 0) {
++ if (len == 0) { /* zip file is empty */
++ if (pmsg) {
++ *pmsg = "zip file is empty";
++ }
++ } else { /* error */
++ if (pmsg && JVM_GetLastErrorString(errbuf, sizeof(errbuf)) > 0)
++ *pmsg = errbuf;
++ }
+ ZFILE_Close(zfd);
+ freeZip(zip);
+ return NULL;
+ }
+
+ zip->zfd = zfd;
+- if (readCEN(zip, -1) <= 0) {
++ if (readCEN(zip, -1) < 0) {
+ /* An error occurred while trying to read the zip file */
+ if (pmsg != 0) {
+ /* Set the zip error message */
+@@ -955,10 +961,15 @@
+ ZIP_GetEntry(jzfile *zip, char *name, jint ulen)
+ {
+ unsigned int hsh = hash(name);
+- jint idx = zip->table[hsh % zip->tablelen];
+- jzentry *ze;
++ jint idx;
++ jzentry *ze = 0;
+
+ ZIP_Lock(zip);
++ if (zip->total == 0) {
++ goto Finally;
++ }
++
++ idx = zip->table[hsh % zip->tablelen];
+
+ /*
+ * This while loop is an optimization where a double lookup
+@@ -1033,6 +1044,7 @@
+ ulen = 0;
+ }
+
++Finally:
+ ZIP_Unlock(zip);
+ return ze;
+ }
+diff -Nru openjdk.orig/jdk/test/java/util/zip/TestEmptyZip.java openjdk/jdk/test/java/util/zip/TestEmptyZip.java
+--- openjdk.orig/jdk/test/java/util/zip/TestEmptyZip.java 1970-01-01 01:00:00.000000000 +0100
++++ openjdk/jdk/test/java/util/zip/TestEmptyZip.java 2015-10-05 01:19:15.676843719 +0100
+@@ -0,0 +1,147 @@
++/*
++ * Copyright (c) 2008, 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.
++ */
++
++/* @test
++ * @bug 6334003 6440786
++ * @summary Test ability to write and read zip files that have no entries.
++ * @author Dave Bristor
++ */
++
++import java.io.*;
++import java.util.*;
++import java.util.zip.*;
++
++public class TestEmptyZip {
++ public static void realMain(String[] args) throws Throwable {
++ String zipName = "foo.zip";
++ File f = new File(System.getProperty("test.scratch", "."), zipName);
++ if (f.exists() && !f.delete()) {
++ throw new Exception("failed to delete " + zipName);
++ }
++
++ // Verify 0-length file cannot be read
++ f.createNewFile();
++ ZipFile zf = null;
++ try {
++ zf = new ZipFile(f);
++ fail();
++ } catch (Exception ex) {
++ check(ex.getMessage().contains("zip file is empty"));
++ } finally {
++ if (zf != null) {
++ zf.close();
++ }
++ }
++
++ ZipInputStream zis = null;
++ try {
++ zis = new ZipInputStream(new FileInputStream(f));
++ ZipEntry ze = zis.getNextEntry();
++ check(ze == null);
++ } catch (Exception ex) {
++ unexpected(ex);
++ } finally {
++ if (zis != null) {
++ zis.close();
++ }
++ }
++
++ f.delete();
++
++ // Verify 0-entries file can be written
++ write(f);
++
++ // Verify 0-entries file can be read
++ readFile(f);
++ readStream(f);
++
++ f.delete();
++ }
++
++ static void write(File f) throws Exception {
++ ZipOutputStream zos = null;
++ try {
++ zos = new ZipOutputStream(new FileOutputStream(f));
++ zos.finish();
++ zos.close();
++ pass();
++ } catch (Exception ex) {
++ unexpected(ex);
++ } finally {
++ if (zos != null) {
++ zos.close();
++ }
++ }
++ }
++
++ static void readFile(File f) throws Exception {
++ ZipFile zf = null;
++ try {
++ zf = new ZipFile(f);
++
++ Enumeration e = zf.entries();
++ while (e.hasMoreElements()) {
++ ZipEntry entry = (ZipEntry) e.nextElement();
++ fail();
++ }
++ zf.close();
++ pass();
++ } catch (Exception ex) {
++ unexpected(ex);
++ } finally {
++ if (zf != null) {
++ zf.close();
++ }
++ }
++ }
++
++ static void readStream(File f) throws Exception {
++ ZipInputStream zis = null;
++ try {
++ zis = new ZipInputStream(new FileInputStream(f));
++ ZipEntry ze = zis.getNextEntry();
++ check(ze == null);
++ byte[] buf = new byte[1024];
++ check(zis.read(buf, 0, 1024) == -1);
++ } finally {
++ if (zis != null) {
++ zis.close();
++ }
++ }
++ }
++
++ //--------------------- Infrastructure ---------------------------
++ static volatile int passed = 0, failed = 0;
++ static boolean pass() {passed++; return true;}
++ static boolean fail() {failed++; Thread.dumpStack(); return false;}
++ static boolean fail(String msg) {System.out.println(msg); return fail();}
++ static void unexpected(Throwable t) {failed++; t.printStackTrace();}
++ static boolean check(boolean cond) {if (cond) pass(); else fail(); return cond;}
++ static boolean equal(Object x, Object y) {
++ if (x == null ? y == null : x.equals(y)) return pass();
++ else return fail(x + " not equal to " + y);}
++ public static void main(String[] args) throws Throwable {
++ try {realMain(args);} catch (Throwable t) {unexpected(t);}
++ System.out.println("\nPassed = " + passed + " failed = " + failed);
++ if (failed > 0) throw new AssertionError("Some tests failed");}
++}
diff -r acc83d51b013 -r f6d8c8e6b8cf patches/openjdk/6599383-pr363-large_zip_files.patch
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/openjdk/6599383-pr363-large_zip_files.patch Mon Oct 12 05:50:22 2015 +0100
@@ -0,0 +1,214 @@
+# HG changeset patch
+# User kevinw
+# Date 1235485328 0
+# Tue Feb 24 14:22:08 2009 +0000
+# Node ID dc237aecf7cf5669588bb2d82e9baca88936fb62
+# Parent abe5e7125bd3b57b7a0c8f5786530695f0d61075
+6599383, PR363: Unable to open zip files more than 2GB in size
+Reviewed-by: alanb
+
+diff -r abe5e7125bd3 -r dc237aecf7cf src/share/native/java/util/zip/zip_util.c
+--- openjdk/jdk/src/share/native/java/util/zip/zip_util.c Tue Feb 24 11:33:25 2009 +0000
++++ openjdk/jdk/src/share/native/java/util/zip/zip_util.c Tue Feb 24 14:22:08 2009 +0000
+@@ -135,11 +135,6 @@
+ #endif
+ }
+
+-static jlong
+-ZFILE_Lseek(ZFILE zfd, off_t offset, int whence) {
+- return IO_Lseek(zfd, offset, whence);
+-}
+-
+ static int
+ ZFILE_read(ZFILE zfd, char *buf, jint nbytes) {
+ #ifdef WIN32
+@@ -216,7 +211,7 @@
+ static int
+ readFullyAt(ZFILE zfd, void *buf, jlong len, jlong offset)
+ {
+- if (ZFILE_Lseek(zfd, (off_t) offset, SEEK_SET) == -1) {
++ if (IO_Lseek(zfd, offset, SEEK_SET) == -1) {
+ return -1; /* lseek failure. */
+ }
+
+@@ -476,7 +471,7 @@
+ unsigned char *cp;
+ #ifdef USE_MMAP
+ static jlong pagesize;
+- off_t offset;
++ jlong offset;
+ #endif
+ unsigned char endbuf[ENDHDR];
+ jzcell *entries;
+@@ -534,7 +529,7 @@
+ */
+ zip->mlen = cenpos - offset + cenlen + ENDHDR;
+ zip->offset = offset;
+- mappedAddr = mmap(0, zip->mlen, PROT_READ, MAP_SHARED, zip->zfd, offset);
++ mappedAddr = mmap64(0, zip->mlen, PROT_READ, MAP_SHARED, zip->zfd, (off64_t) offset);
+ zip->maddr = (mappedAddr == (void*) MAP_FAILED) ? NULL :
+ (unsigned char*)mappedAddr;
+
+@@ -720,7 +715,7 @@
+ return NULL;
+ }
+
+- len = zip->len = ZFILE_Lseek(zfd, 0, SEEK_END);
++ len = zip->len = IO_Lseek(zfd, 0, SEEK_END);
+ if (len <= 0) {
+ if (len == 0) { /* zip file is empty */
+ if (pmsg) {
+diff -r abe5e7125bd3 -r dc237aecf7cf src/share/native/java/util/zip/zip_util.h
+--- openjdk/jdk/src/share/native/java/util/zip/zip_util.h Tue Feb 24 11:33:25 2009 +0000
++++ openjdk/jdk/src/share/native/java/util/zip/zip_util.h Tue Feb 24 14:22:08 2009 +0000
+@@ -174,7 +174,7 @@
+ #ifdef USE_MMAP
+ unsigned char *maddr; /* beginning address of the CEN & ENDHDR */
+ jlong mlen; /* length (in bytes) mmaped */
+- off_t offset; /* offset of the mmapped region from the
++ jlong offset; /* offset of the mmapped region from the
+ start of the file. */
+ #else
+ cencache cencache; /* CEN header cache */
+diff -r abe5e7125bd3 -r dc237aecf7cf test/java/util/zip/ZipFile/LargeZipFile.java
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ openjdk/jdk/test/java/util/zip/ZipFile/LargeZipFile.java Tue Feb 24 14:22:08 2009 +0000
+@@ -0,0 +1,138 @@
++import java.io.*;
++import java.nio.*;
++import java.util.*;
++import java.util.zip.*;
++
++public class LargeZipFile {
++ // If true, don't delete large ZIP file created for test.
++ static final boolean debug = System.getProperty("debug") != null;
++
++ static final int DATA_LEN = 1024 * 1024;
++ static final int DATA_SIZE = 8;
++
++ static long fileSize = 3L * 1024L * 1024L * 1024L; // 3GB
++
++ static boolean userFile = false;
++
++ static byte[] data;
++ static File largeFile;
++ static String lastEntryName;
++
++ /* args can be empty, in which case check a 3 GB file which is created for
++ * this test (and then deleted). Or it can be a number, in which case
++ * that designates the size of the file that's created for this test (and
++ * then deleted). Or it can be the name of a file to use for the test, in
++ * which case it is *not* deleted. Note that in this last case, the data
++ * comparison might fail.
++ */
++ static void realMain (String[] args) throws Throwable {
++ if (args.length > 0) {
++ try {
++ fileSize = Long.parseLong(args[0]);
++ System.out.println("Testing with file of size " + fileSize);
++ } catch (NumberFormatException ex) {
++ largeFile = new File(args[0]);
++ if (!largeFile.exists()) {
++ throw new Exception("Specified file " + args[0] + " does not exist");
++ }
++ userFile = true;
++ System.out.println("Testing with user-provided file " + largeFile);
++ }
++ }
++ File testDir = null;
++ if (largeFile == null) {
++ testDir = new File(System.getProperty("test.scratch", "."),
++ "LargeZip");
++ if (testDir.exists()) {
++ if (!testDir.delete()) {
++ throw new Exception("Cannot delete already-existing test directory");
++ }
++ }
++ check(!testDir.exists() && testDir.mkdirs());
++ largeFile = new File(testDir, "largezip.zip");
++ createLargeZip();
++ }
++
++ readLargeZip();
++
++ if (!userFile && !debug) {
++ check(largeFile.delete());
++ check(testDir.delete());
++ }
++ }
++
++ static void createLargeZip() throws Throwable {
++ int iterations = DATA_LEN / DATA_SIZE;
++ ByteBuffer bb = ByteBuffer.allocate(DATA_SIZE);
++ ByteArrayOutputStream baos = new ByteArrayOutputStream();
++ for (int i = 0; i < iterations; i++) {
++ bb.putDouble(0, Math.random());
++ baos.write(bb.array(), 0, DATA_SIZE);
++ }
++ data = baos.toByteArray();
++
++ ZipOutputStream zos = new ZipOutputStream(
++ new BufferedOutputStream(new FileOutputStream(largeFile)));
++ long length = 0;
++ while (length < fileSize) {
++ ZipEntry ze = new ZipEntry("entry-" + length);
++ lastEntryName = ze.getName();
++ zos.putNextEntry(ze);
++ zos.write(data, 0, data.length);
++ zos.closeEntry();
++ length = largeFile.length();
++ }
++ System.out.println("Last entry written is " + lastEntryName);
++ zos.close();
++ }
++
++ static void readLargeZip() throws Throwable {
++ ZipFile zipFile = new ZipFile(largeFile);
++ ZipEntry entry = null;
++ String entryName = null;
++ int count = 0;
++ Enumeration<? extends ZipEntry> entries = zipFile.entries();
++ while (entries.hasMoreElements()) {
++ entry = entries.nextElement();
++ entryName = entry.getName();
++ count++;
++ }
++ System.out.println("Number of entries read: " + count);
++ System.out.println("Last entry read is " + entryName);
++ check(!entry.isDirectory());
++ if (check(entryName.equals(lastEntryName))) {
++ ByteArrayOutputStream baos = new ByteArrayOutputStream();
++ InputStream is = zipFile.getInputStream(entry);
++ byte buf[] = new byte[4096];
More information about the distro-pkg-dev
mailing list