diff --git a/src/share/classes/com/sun/jmx/snmp/SnmpString.java b/src/share/classes/com/sun/jmx/snmp/SnmpString.java index 9ec7f7cd5206a38526fa1e88026e930b2214cfe8..76af600386ae1dc66798999e820adc602d228bd3 100644 --- a/src/share/classes/com/sun/jmx/snmp/SnmpString.java +++ b/src/share/classes/com/sun/jmx/snmp/SnmpString.java @@ -130,7 +130,7 @@ public class SnmpString extends SnmpValue { * @return The value. */ public byte[] byteValue() { - return value ; + return value.clone() ; } /** diff --git a/src/share/classes/com/sun/jmx/snmp/agent/SnmpMib.java b/src/share/classes/com/sun/jmx/snmp/agent/SnmpMib.java index df7587404ef283564e2730fe3865a3d0120911e1..ac9c4bbd54fdfbc23395c238359c72d691b2988b 100644 --- a/src/share/classes/com/sun/jmx/snmp/agent/SnmpMib.java +++ b/src/share/classes/com/sun/jmx/snmp/agent/SnmpMib.java @@ -476,8 +476,7 @@ public abstract class SnmpMib extends SnmpMibAgent implements Serializable { rootOid[i++]= val.longValue(); } } - return rootOid; - + return rootOid.clone(); } // -------------------------------------------------------------------- diff --git a/src/share/classes/com/sun/jmx/snmp/daemon/CommunicatorServer.java b/src/share/classes/com/sun/jmx/snmp/daemon/CommunicatorServer.java index b2634d8eee1ed281e89c94c3a37411f04c6b3364..b0828e21be97562d78fd69b6508dc0b674c30cd8 100644 --- a/src/share/classes/com/sun/jmx/snmp/daemon/CommunicatorServer.java +++ b/src/share/classes/com/sun/jmx/snmp/daemon/CommunicatorServer.java @@ -1248,7 +1248,7 @@ public abstract class CommunicatorServer "of this CommunicatorServer instance has changed."); } - return notifInfos; + return notifInfos.clone(); } /** diff --git a/test/com/sun/jmx/snmp/NoInfoLeakTest.java b/test/com/sun/jmx/snmp/NoInfoLeakTest.java new file mode 100644 index 0000000000000000000000000000000000000000..dcf54416a08d47b1f5c5cd4b4311f32a41b3e80a --- /dev/null +++ b/test/com/sun/jmx/snmp/NoInfoLeakTest.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2013, 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 8026028 + * @summary Tests no leak of internal info + * @author Shanliang JIANG + * @run clean NoInfoLeakTest + * @run build NoInfoLeakTest + * @run main NoInfoLeakTest + */ + +import com.sun.jmx.snmp.SnmpString; +import com.sun.jmx.snmp.agent.SnmpMib; +import com.sun.jmx.snmp.agent.SnmpMibTable; +import com.sun.jmx.snmp.daemon.CommunicatorServer; +import com.sun.jmx.snmp.daemon.SnmpAdaptorServer; +import javax.management.MBeanNotificationInfo; +import javax.management.MBeanServer; +import javax.management.ObjectName; + +public class NoInfoLeakTest { + public static void main(String[] args) throws Exception { + boolean ok = true; + ok &= snmpStringTest(); + ok &= snmpMibTest(); + ok &= communicatorServerTest(); + + if (!ok) { + throw new RuntimeException("Some tests are failed!"); + } + } + + private static boolean snmpStringTest() { + System.out.println("\n---NoInfoLeakTest-snmpStringTest: testing the method byteValue()..."); + boolean passed = true; + + byte[] mine = new byte[]{1,1,1,}; + SnmpString ss = new SnmpString(mine); + byte[] got = ss.byteValue(); + got[0]=0; + + if (ss.byteValue()[0] == 0) { + System.err.println("Failed: SnmpString.byteValue() returns an internal mutable object value"); + passed = false; + } else { + System.out.println("---NoInfoLeakTest-snmpStringTest done."); + } + return passed; + } + + private static boolean snmpMibTest() { + boolean passed = true; + System.out.println("\n---NoInfoLeakTest-snmpMibTest: testing the method " + + "SnmpMib.getRootOid()..."); + SnmpMib mib = new MySnmpMib(); + + if (mib.getRootOid() == mib.getRootOid()) { + System.err.println("Failed: SnmpMib.getRootOid() returns an internal" + + " mutable object value "+mib.getRootOid()); + } else { + System.out.println("---NoInfoLeakTest-snmpMibTest done."); + } + return passed; + } + + private static boolean communicatorServerTest() { + boolean passed = true; + System.out.println("\n---NoInfoLeakTest-communicatorServerTest: testing the method CommunicatorServer.getNotificationInfo()..."); + CommunicatorServer server = new SnmpAdaptorServer(); + MBeanNotificationInfo[] notifs = server.getNotificationInfo(); + + assert notifs.length > 0 && notifs[0] != null; // the current implementation ensures this + notifs[0] = null; + if (server.getNotificationInfo()[0] == null) { + System.err.println("Failed: CommunicatorServer.getNotificationInfo()" + + " returns an internal mutable object value"); + passed = false; + } else { + System.out.println("---NoInfoLeakTest-communicatorServerTest done."); + } + return passed; + } + + private static class MySnmpMib extends SnmpMib { + @Override + public void registerTableMeta(String name, SnmpMibTable table) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public SnmpMibTable getRegisteredTableMeta(String name) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void init() throws IllegalAccessException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { + throw new UnsupportedOperationException("Not supported yet."); + } + } +}