From bac1932a29379f7e2e50dc9563af06f58df7db02 Mon Sep 17 00:00:00 2001 From: weijun Date: Thu, 22 Apr 2010 12:45:36 +0800 Subject: [PATCH] 6856069: PrincipalName.clone() does not invoke super.clone() Reviewed-by: chegar --- .../sun/security/krb5/PrincipalName.java | 27 ++++++------ test/sun/security/krb5/ServiceNameClone.java | 41 +++++++++++++++++++ 2 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 test/sun/security/krb5/ServiceNameClone.java diff --git a/src/share/classes/sun/security/krb5/PrincipalName.java b/src/share/classes/sun/security/krb5/PrincipalName.java index 6705fd63e..91d5d8bb3 100644 --- a/src/share/classes/sun/security/krb5/PrincipalName.java +++ b/src/share/classes/sun/security/krb5/PrincipalName.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-2010 Sun Microsystems, Inc. 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 @@ -101,7 +101,7 @@ public class PrincipalName private Realm nameRealm; // optional; a null realm means use default // Note: the nameRealm is not included in the default ASN.1 encoding - // salt for principal + // cached salt, might be changed by KDC info, not used in clone private String salt = null; protected PrincipalName() { @@ -123,18 +123,19 @@ public class PrincipalName } public Object clone() { - PrincipalName pName = new PrincipalName(); - pName.nameType = nameType; - if (nameStrings != null) { - pName.nameStrings = - new String[nameStrings.length]; - System.arraycopy(nameStrings,0,pName.nameStrings,0, - nameStrings.length); - } - if (nameRealm != null) { - pName.nameRealm = (Realm)nameRealm.clone(); + try { + PrincipalName pName = (PrincipalName) super.clone(); + // Re-assign mutable fields + if (nameStrings != null) { + pName.nameStrings = nameStrings.clone(); + } + if (nameRealm != null) { + pName.nameRealm = (Realm)nameRealm.clone(); + } + return pName; + } catch (CloneNotSupportedException ex) { + throw new AssertionError("Should never happen"); } - return pName; } /* diff --git a/test/sun/security/krb5/ServiceNameClone.java b/test/sun/security/krb5/ServiceNameClone.java new file mode 100644 index 000000000..282712c03 --- /dev/null +++ b/test/sun/security/krb5/ServiceNameClone.java @@ -0,0 +1,41 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +/* + * @test + * @bug 6856069 + * @summary PrincipalName.clone() does not invoke super.clone() + */ + +import sun.security.krb5.ServiceName; + +public class ServiceNameClone { + public static void main(String[] args) throws Exception { + ServiceName sn = new ServiceName("me@HERE"); + if (sn.clone().getClass() != ServiceName.class) { + throw new Exception("ServiceName's clone is not a ServiceName"); + } + if (!sn.clone().equals(sn)) { + throw new Exception("ServiceName's clone changed"); + } + } +} -- GitLab