From ec5c28ece1abe76452e1c70918fb44c543b71a81 Mon Sep 17 00:00:00 2001 From: Bryce McKinlay Date: Fri, 23 Jul 2004 22:20:14 +0000 Subject: [PATCH] Connection.java: Use GetPropertyAction for privileged getProperty calls. 2004-07-23 Bryce McKinlay * gnu/java/net/protocol/http/Connection.java: Use GetPropertyAction for privileged getProperty calls. * java/io/ObjectOutputStream.java (getField): No longer static. Use SetAccessibleAction instead of anonymous class for doPrivileged call. (getMethod): Likewise. (setAccessible): New field. PrivilegedAction object to use when calling setAccessible. * java/io/ObjectStreamClass.java (calculateOffsets): Use SetAccessibleAction instead of anonymous class for diPrivileged call. (setFields): Likewise. (getClassUID): Likewise. (findMethod): Likewise. * gnu/java/security/action/GetPropertyAction.java: New class. * gnu/java/security/action/SetAccessibleAction.java: New class. From-SVN: r85097 --- libjava/ChangeLog | 21 ++++- .../java/net/protocol/http/Connection.java | 54 ++++++------- .../security/action/GetPropertyAction.java | 75 ++++++++++++++++++ .../security/action/SetAccessibleAction.java | 77 +++++++++++++++++++ libjava/java/io/ObjectOutputStream.java | 26 ++----- libjava/java/io/ObjectStreamClass.java | 47 ++++------- 6 files changed, 217 insertions(+), 83 deletions(-) create mode 100644 libjava/gnu/java/security/action/GetPropertyAction.java create mode 100644 libjava/gnu/java/security/action/SetAccessibleAction.java diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 8cb5ecb0dbb..9b467ae0b87 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,7 +1,24 @@ 2004-07-23 Bryce McKinlay - * java/io/ObjectStreamField (ObjectStreamField): Don't unset 'toset' for final - fields. + * gnu/java/net/protocol/http/Connection.java: Use GetPropertyAction + for privileged getProperty calls. + * java/io/ObjectOutputStream.java (getField): No longer static. Use + SetAccessibleAction instead of anonymous class for doPrivileged call. + (getMethod): Likewise. + (setAccessible): New field. PrivilegedAction object to use when + calling setAccessible. + * java/io/ObjectStreamClass.java (calculateOffsets): Use + SetAccessibleAction instead of anonymous class for diPrivileged call. + (setFields): Likewise. + (getClassUID): Likewise. + (findMethod): Likewise. + * gnu/java/security/action/GetPropertyAction.java: New class. + * gnu/java/security/action/SetAccessibleAction.java: New class. + +2004-07-23 Bryce McKinlay + + * java/io/ObjectStreamField (ObjectStreamField): Don't unset 'toset' + for final fields. * testsuite/libjava.lang/Serialization.java: New test. * testsuite/libjava.lang/Serialization.out: New. diff --git a/libjava/gnu/java/net/protocol/http/Connection.java b/libjava/gnu/java/net/protocol/http/Connection.java index 728d14a7e6b..ccae499dc33 100644 --- a/libjava/gnu/java/net/protocol/http/Connection.java +++ b/libjava/gnu/java/net/protocol/http/Connection.java @@ -59,6 +59,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import gnu.java.net.HeaderFieldHelper; +import gnu.java.security.action.GetPropertyAction; /** * This subclass of java.net.URLConnection models a URLConnection via @@ -88,36 +89,31 @@ public final class Connection extends HttpURLConnection static { - // Make sure access control for system properties depends only on - // our class ProtectionDomain, not on any (indirect) callers. - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() - { - // Recognize some networking properties listed at - // http://java.sun.com/j2se/1.4/docs/guide/net/properties.html. - String port = null; - proxyHost = System.getProperty("http.proxyHost"); - if (proxyHost != null) - { - proxyInUse = true; - if ((port = System.getProperty("http.proxyPort")) != null) - { - try - { - proxyPort = Integer.parseInt(port); - } - catch (Throwable t) - { - // Nothing. - } - } - } - - userAgent = System.getProperty("http.agent"); + // Recognize some networking properties listed at + // http://java.sun.com/j2se/1.4/docs/guide/net/properties.html. + String port = null; + GetPropertyAction getProperty = new GetPropertyAction("http.proxyHost"); + proxyHost = (String) AccessController.doPrivileged(getProperty); + if (proxyHost != null) + { + proxyInUse = true; + getProperty.setName("http.proxyPort"); + port = (String) AccessController.doPrivileged(getProperty); + if (port != null) + { + try + { + proxyPort = Integer.parseInt(port); + } + catch (NumberFormatException ex) + { + // Nothing. + } + } + } - return null; - } - }); + getProperty.setName("http.agent"); + userAgent = (String) AccessController.doPrivileged(getProperty); } /** diff --git a/libjava/gnu/java/security/action/GetPropertyAction.java b/libjava/gnu/java/security/action/GetPropertyAction.java new file mode 100644 index 00000000000..f40f479bae7 --- /dev/null +++ b/libjava/gnu/java/security/action/GetPropertyAction.java @@ -0,0 +1,75 @@ +/* GetPropertyAction.java + Copyright (C) 2004 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath 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 for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +package gnu.java.security.action; + +import java.security.PrivilegedAction; + +/** + * PrivilegedAction implementation that calls System.getProperty() with + * the property name passed to its constructor. + * + * Example of use: + * + * GetPropertyAction action = new GetPropertyAction("http.proxyPort"); + * String port = AccessController.doPrivileged(action); + * + */ +public class GetPropertyAction implements PrivilegedAction +{ + String propName; + + public GetPropertyAction() + { + } + + public GetPropertyAction(String propName) + { + this.propName = propName; + } + + public Object run() + { + return System.getProperty(propName); + } + + public GetPropertyAction setName(String propName) + { + this.propName = propName; + return this; + } +} diff --git a/libjava/gnu/java/security/action/SetAccessibleAction.java b/libjava/gnu/java/security/action/SetAccessibleAction.java new file mode 100644 index 00000000000..810681fd84c --- /dev/null +++ b/libjava/gnu/java/security/action/SetAccessibleAction.java @@ -0,0 +1,77 @@ +/* SetAccessibleAction.java + Copyright (C) 2004 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath 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 for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +package gnu.java.security.action; + +import java.lang.reflect.AccessibleObject; +import java.security.PrivilegedAction; + +/** + * PrivilagedAction implementation that calls setAccessible(true) on the + * AccessibleObject passed to its constructor. + * + * Example of use: + * + * Field dataField = cl.getDeclaredField("data"); + * AccessController.doPrivilaged(new SetAccessibleAction(dataField)); + * + */ +public class SetAccessibleAction implements PrivilegedAction +{ + AccessibleObject member; + + public SetAccessibleAction() + { + } + + public SetAccessibleAction(AccessibleObject member) + { + this.member = member; + } + + public Object run() + { + member.setAccessible(true); + return null; + } + + public SetAccessibleAction setMember(AccessibleObject member) + { + this.member = member; + return this; + } +} diff --git a/libjava/java/io/ObjectOutputStream.java b/libjava/java/io/ObjectOutputStream.java index cc77976b492..2435b070d08 100644 --- a/libjava/java/io/ObjectOutputStream.java +++ b/libjava/java/io/ObjectOutputStream.java @@ -48,6 +48,7 @@ import java.util.Hashtable; import gnu.java.io.ObjectIdentityWrapper; import gnu.java.lang.reflect.TypeSignature; +import gnu.java.security.action.SetAccessibleAction; import gnu.classpath.Configuration; /** @@ -1516,20 +1517,14 @@ public class ObjectOutputStream extends OutputStream } } - private static Field getField (Class klass, String name) + private Field getField (Class klass, String name) throws java.io.InvalidClassException { try { final Field f = klass.getDeclaredField(name); - AccessController.doPrivileged(new PrivilegedAction() - { - public Object run() - { - f.setAccessible(true); - return null; - } - }); + setAccessible.setMember(f); + AccessController.doPrivileged(setAccessible); return f; } catch (java.lang.NoSuchFieldException e) @@ -1539,18 +1534,12 @@ public class ObjectOutputStream extends OutputStream } } - private static Method getMethod (Class klass, String name, Class[] args) + private Method getMethod (Class klass, String name, Class[] args) throws java.lang.NoSuchMethodException { final Method m = klass.getDeclaredMethod(name, args); - AccessController.doPrivileged(new PrivilegedAction() - { - public Object run() - { - m.setAccessible(true); - return null; - } - }); + setAccessible.setMember(m); + AccessController.doPrivileged(setAccessible); return m; } @@ -1583,6 +1572,7 @@ public class ObjectOutputStream extends OutputStream private Hashtable OIDLookupTable; private int protocolVersion; private boolean useSubclassMethod; + private SetAccessibleAction setAccessible = new SetAccessibleAction(); // The nesting depth for debugging output private int depth = 0; diff --git a/libjava/java/io/ObjectStreamClass.java b/libjava/java/io/ObjectStreamClass.java index ee23f5996b5..08576cd1f7a 100644 --- a/libjava/java/io/ObjectStreamClass.java +++ b/libjava/java/io/ObjectStreamClass.java @@ -57,6 +57,7 @@ import java.util.Hashtable; import java.util.Vector; import gnu.java.io.NullOutputStream; import gnu.java.lang.reflect.TypeSignature; +import gnu.java.security.action.SetAccessibleAction; import gnu.java.security.provider.Gnu; @@ -470,14 +471,8 @@ outer: } } final Method m = methods[i]; - AccessController.doPrivileged(new PrivilegedAction() - { - public Object run() - { - m.setAccessible(true); - return null; - } - }); + SetAccessibleAction setAccessible = new SetAccessibleAction(m); + AccessController.doPrivileged(setAccessible); return m; } } @@ -543,6 +538,8 @@ outer: // clazz. private void setFields(Class cl) { + SetAccessibleAction setAccessible = new SetAccessibleAction(); + if (!isSerializable() || isExternalizable()) { fields = NO_FIELDS; @@ -551,17 +548,11 @@ outer: try { - final Field serialPersistentFields = + final Field f = cl.getDeclaredField("serialPersistentFields"); - AccessController.doPrivileged(new PrivilegedAction() - { - public Object run() - { - serialPersistentFields.setAccessible(true); - return null; - } - }); - int modifiers = serialPersistentFields.getModifiers(); + setAccessible.setMember(f); + AccessController.doPrivileged(setAccessible); + int modifiers = f.getModifiers(); if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers) @@ -617,14 +608,8 @@ outer: if (all_fields[from] != null) { final Field f = all_fields[from]; - AccessController.doPrivileged(new PrivilegedAction() - { - public Object run() - { - f.setAccessible(true); - return null; - } - }); + setAccessible.setMember(f); + AccessController.doPrivileged(setAccessible); fields[to] = new ObjectStreamField(all_fields[from]); to++; } @@ -651,14 +636,8 @@ outer: // may not be public AND we only want the serialVersionUID of this // class, not a superclass or interface. final Field suid = cl.getDeclaredField("serialVersionUID"); - AccessController.doPrivileged(new PrivilegedAction() - { - public Object run() - { - suid.setAccessible(true); - return null; - } - }); + SetAccessibleAction setAccessible = new SetAccessibleAction(suid); + AccessController.doPrivileged(setAccessible); int modifiers = suid.getModifiers(); if (Modifier.isStatic(modifiers) -- 2.30.2