From 4b93eff932e2052582996d3af5bec6553575941d Mon Sep 17 00:00:00 2001 From: Kumar Srinivasan Date: Thu, 14 Oct 2010 14:41:08 -0700 Subject: [PATCH] 6982312: (pack200) pack200 fails with the jdk7 class files Reviewed-by: jrose --- .../sun/java/util/jar/pack/ClassReader.java | 18 ++++- .../sun/java/util/jar/pack/Instruction.java | 19 +++++ .../sun/java/util/jar/pack/PackerImpl.java | 28 +++++-- .../com/sun/java/util/jar/pack/Utils.java | 3 - jdk/test/tools/pack200/AttributeTests.java | 75 ++++++++++++++++++ jdk/test/tools/pack200/dyn.jar | Bin 0 -> 1963 bytes 6 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 jdk/test/tools/pack200/AttributeTests.java create mode 100644 jdk/test/tools/pack200/dyn.jar diff --git a/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java b/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java index a14bf350a6f..cf588957cbf 100644 --- a/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java +++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java @@ -246,7 +246,9 @@ class ClassReader implements Constants { fixups[fptr++] = in.readUnsignedShort(); break; default: - throw new IOException("Bad constant pool tag "+tag); + throw new ClassFormatException("Bad constant pool tag " + + tag + " in File: " + cls.file.nameString + + " at pos: " + inPos); } } @@ -415,7 +417,12 @@ class ClassReader implements Constants { if (a.name() == "Code") { Class.Method m = (Class.Method) h; m.code = new Code(m); - readCode(m.code); + try { + readCode(m.code); + } catch (Instruction.FormatException iie) { + String message = iie.getMessage() + " in " + h; + throw new ClassReader.ClassFormatException(message); + } } else { assert(h == cls); readInnerClasses(cls); @@ -438,6 +445,7 @@ class ClassReader implements Constants { code.max_locals = readUnsignedShort(); code.bytes = new byte[readInt()]; in.readFully(code.bytes); + Instruction.opcodeChecker(code.bytes); int nh = readUnsignedShort(); code.setHandlerCount(nh); for (int i = 0; i < nh; i++) { @@ -463,4 +471,10 @@ class ClassReader implements Constants { cls.innerClasses = ics; // set directly; do not use setInnerClasses. // (Later, ics may be transferred to the pkg.) } + + class ClassFormatException extends IOException { + public ClassFormatException(String message) { + super(message); + } + } } diff --git a/jdk/src/share/classes/com/sun/java/util/jar/pack/Instruction.java b/jdk/src/share/classes/com/sun/java/util/jar/pack/Instruction.java index bef43fd0f03..2eb4604ec08 100644 --- a/jdk/src/share/classes/com/sun/java/util/jar/pack/Instruction.java +++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/Instruction.java @@ -25,6 +25,8 @@ package com.sun.java.util.jar.pack; +import java.io.IOException; + /** * A parsed bytecode instruction. * Provides accessors to various relevant bits. @@ -628,4 +630,21 @@ class Instruction implements Constants { } } } + + public static void opcodeChecker(byte[] code) throws FormatException { + Instruction i = at(code, 0); + while (i != null) { + int opcode = i.getBC(); + if (opcode == _xxxunusedxxx || opcode < _nop || opcode > _jsr_w) { + String message = "illegal opcode: " + opcode + " " + i; + throw new FormatException(message); + } + i = i.next(); + } + } + static class FormatException extends IOException { + FormatException(String message) { + super(message); + } + } } diff --git a/jdk/src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java b/jdk/src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java index 449bbbeb5b1..a45a4bcba09 100644 --- a/jdk/src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java +++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java @@ -496,15 +496,29 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer { reader.unknownAttrCommand = unknownAttrCommand; try { reader.read(); - } catch (Attribute.FormatException ee) { - // He passed up the category to us in layout. - if (ee.layout.equals(Pack200.Packer.PASS)) { - Utils.log.warning("Passing class file uncompressed due to unrecognized attribute: "+fname); - Utils.log.info(ee.toString()); - return null; + } catch (IOException ioe) { + String message = "Passing class file uncompressed due to"; + if (ioe instanceof Attribute.FormatException) { + Attribute.FormatException ee = (Attribute.FormatException) ioe; + // He passed up the category to us in layout. + if (ee.layout.equals(Pack200.Packer.PASS)) { + Utils.log.info(ee.toString()); + Utils.log.warning(message + " unrecognized attribute: " + + fname); + return null; + } + } else if (ioe instanceof ClassReader.ClassFormatException) { + ClassReader.ClassFormatException ce = (ClassReader.ClassFormatException) ioe; + // %% TODO: Do we invent a new property for this or reuse %% + if (unknownAttrCommand.equals(Pack200.Packer.PASS)) { + Utils.log.info(ce.toString()); + Utils.log.warning(message + " unknown class format: " + + fname); + return null; + } } // Otherwise, it must be an error. - throw ee; + throw ioe; } pkg.addClass(cls); return cls.file; diff --git a/jdk/src/share/classes/com/sun/java/util/jar/pack/Utils.java b/jdk/src/share/classes/com/sun/java/util/jar/pack/Utils.java index 33524325d8e..84f65ac2ccf 100644 --- a/jdk/src/share/classes/com/sun/java/util/jar/pack/Utils.java +++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/Utils.java @@ -182,11 +182,8 @@ class Utils { } public void warning(String msg, Object param) { - int verbose = currentPropMap().getInteger(DEBUG_VERBOSE); - if (verbose > 0) { getLogger().warning(msg, param); } - } public void warning(String msg) { warning(msg, null); diff --git a/jdk/test/tools/pack200/AttributeTests.java b/jdk/test/tools/pack200/AttributeTests.java new file mode 100644 index 00000000000..73e00d23a61 --- /dev/null +++ b/jdk/test/tools/pack200/AttributeTests.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2010, 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.IOException; +import java.util.ArrayList; +import java.util.List; + +/* + * @test + * @bug 6982312 + * @summary tests various classfile format and attribute handling by pack200 + * @compile -XDignore.symbol.file Utils.java AttributeTests.java + * @run main AttributeTests + * @author ksrini + */ + + +public class AttributeTests { + + public static void main(String... args) throws Exception { + test6982312(); + } + /* + * This is an interim test, which ensures pack200 handles JSR-292 related + * classfile changes seamlessly, until all the classfile changes in jdk7 + * and jdk8 are fully supported. At that time this test should be jettisoned, + * along with the associated jar file. + * + * The jar file contains sources and classes noting the classes were + * derived by using the javac from the lambda project, + * see http://openjdk.java.net/projects/lambda/. + * Therefore the classes contained in the jar cannot be compiled, using + * the standard jdk7's javac compiler. + */ + static void test6982312() throws IOException { + String pack200Cmd = Utils.getPack200Cmd(); + File dynJar = new File(".", "dyn.jar"); + Utils.copyFile(new File(Utils.TEST_SRC_DIR, "dyn.jar"), dynJar); + File testJar = new File(".", "test.jar"); + List cmds = new ArrayList(); + cmds.add(pack200Cmd); + cmds.add("--repack"); + cmds.add(testJar.getAbsolutePath()); + cmds.add(dynJar.getAbsolutePath()); + Utils.runExec(cmds); + /* + * compare the repacked jar bit-wise, as all the files + * should be transmitted "as-is". + */ + Utils.doCompareBitWise(dynJar.getAbsoluteFile(), testJar.getAbsoluteFile()); + testJar.delete(); + dynJar.delete(); + } +} diff --git a/jdk/test/tools/pack200/dyn.jar b/jdk/test/tools/pack200/dyn.jar new file mode 100644 index 0000000000000000000000000000000000000000..b04c2a9e825b1201cbdcd2f863478587356ce7ec GIT binary patch literal 1963 zcmWIWW@Zs#U|`^2c-v!byUlj8x<8PY48(j4G7O%1X{kl2dC94IS&3zdp&^_M%yyOw zeXja1^eL_2W?*D_%gn&Q!pOwHaQck4r>>W`k6$Q9*_Y52&z@?XKJOEF;_8Jh&z`P& z`t;FLuXCO{dSM)%x_XQ!#ipxFOHtEy5RuHx&d1H~Dgj+?o~Swaqc4$yzY58#_4Sl{Zs zK1N`(P0!DM{(Pq5+3)o?!x{Pm^cS_5vYX4^Dcab_%RZZL$JIOc?Efp&&5J&J z=-6~~d%L_{J9>4+%Qw7zu&!J7&gQ_)4~--ILzkQ}Zp%4qpLSyJh1!!F?gUP>k>KBL zWG8fY!i+f+I}fFpj2|xI=~uL$ zkhtQcUy01OlWZHOh`cIXJ9*VNCqdTg^}E$KrAtkp;VisbBV)^7SJ6;g8TY@1P7gxV zoqZ3yeCZ&WxT5E3)as}DZb=zFU!QQ!=V^JEYd1ydk=th%pPgRsJ_l;JD(&o4jh)@- zwWCkP-)+-!7YRSfFum*5YeM%=G&{q$B%a)b5y)b zwJOz*uCiBV%6}cV@65ixN5d?m|2AuH(AGFp&}uOIAnTsh#yS(rC#G@x&6+I~S(2RG z`$tyfgMjOs%cs?Bqg7q|zFg0UpMSmnu{k24Yy>8hHCO-V{Q#!jtH8tpNx!g!0#Cns z*wabxgwt7v4Fp`j|LbzRYmwkHb;`bM(bP@qwxH_&xZN!d;>-5V zZnR9_VX*A&31gWn3qEP>s(H_5^(eYzm1)&G#g5UUOfiZzss^bF!HmfdN?7ky zNHN!(bDk=ue`?P6PYtskvaDB-+A{6PyHj;vpKf)3@?}b+#L3%UDGJwTU%g*;d-p2- z$@}*1{@-4=%JSQoZ(MdvD`MLTXh ze=o;Jx9t;vvHJn3BPhRd!$>;GTaTX<&! z>tUC>PX(QYmO5pfd;Eb3;hgEAdbULcnR=?gsB8mbkaI#(i%XEQeBYLSY*{|G|E%|6 z2Z5va&2od1bFyEDe|)s@>xBln)lDKxoK`t?v*+JVxw7S?+b6|u=RYl}5IFxY@R5or z7vGyVpDI4j-hSU+em+CrMYDyA!>$LKUohC%xvX(oqb}p$BjI&bY70ttZD)Gw_++BP z-H)QNsSl?->YT&2X38OD#$uV&jo#vQ>#pcswLQ8d=GECJo3|t^$Xe8to7Q{Yovlpg zO;Z0%VXvS@w|ASESIWJ4{j%rIl|xpmn11Jp-11!Z#v*v7{G?i8cl~ZfR(}!hHLXQ{ ztx5&A3c1?02YlEoYQj@nb6 zJ(PCYe5GmG-o<}d&sL^Rtv`ELM@Do?<*HfF|IN-#j!a6u`ZKO+yUN**-Xr08)7ENv?Yzx!DhnpCbSR-8VV}J@feDk z#Sso&(s%$^J9y^7425KPpqZcykH<{RWRGkn0}BI6CIFfT$^>}K!%Vjbj~{642bzbR bih<^VQZa^ktZblwVg