Connection.java: Use GetPropertyAction for privileged getProperty calls.
authorBryce McKinlay <mckinlay@redhat.com>
Fri, 23 Jul 2004 22:20:14 +0000 (22:20 +0000)
committerBryce McKinlay <bryce@gcc.gnu.org>
Fri, 23 Jul 2004 22:20:14 +0000 (23:20 +0100)
2004-07-23  Bryce McKinlay  <mckinlay@redhat.com>

* 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
libjava/gnu/java/net/protocol/http/Connection.java
libjava/gnu/java/security/action/GetPropertyAction.java [new file with mode: 0644]
libjava/gnu/java/security/action/SetAccessibleAction.java [new file with mode: 0644]
libjava/java/io/ObjectOutputStream.java
libjava/java/io/ObjectStreamClass.java

index 8cb5ecb0dbbc4676f8d7021ee97d03220308119c..9b467ae0b87d002b36d5f40a1c67ff859a0e7fef 100644 (file)
@@ -1,7 +1,24 @@
 2004-07-23  Bryce McKinlay  <mckinlay@redhat.com>
 
-       * 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  <mckinlay@redhat.com>
+
+       * java/io/ObjectStreamField (ObjectStreamField): Don't unset 'toset'
+       for final fields.
        * testsuite/libjava.lang/Serialization.java: New test.
        * testsuite/libjava.lang/Serialization.out: New.
 
index 728d14a7e6b9d1329bb86fe69826315f6bd0253e..ccae499dc33dc3997cc2fcc4502cac292cf4a4fc 100644 (file)
@@ -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 (file)
index 0000000..f40f479
--- /dev/null
@@ -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:
+ * <code>
+ * GetPropertyAction action = new GetPropertyAction("http.proxyPort");
+ * String port = AccessController.doPrivileged(action);
+ * </code>
+ */
+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 (file)
index 0000000..810681f
--- /dev/null
@@ -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:
+ * <code>
+ * Field dataField = cl.getDeclaredField("data");
+ * AccessController.doPrivilaged(new SetAccessibleAction(dataField));
+ * </code>
+ */
+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;
+  }
+}
index cc77976b492e040cf574644e49bf4f45c8fad9fd..2435b070d08f3ce4c70296198f715a16a3a54480 100644 (file)
@@ -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;
index ee23f5996b5eb1cfd2811a6421e386cffa66f254..08576cd1f7a05def26da07865c7fed0e9c84d248 100644 (file)
@@ -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)