/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