# HG changeset patch # User rriggs # Date 1475605134 14400 # Node ID 3f8807f6fec3da0f2d84d311f2a78a608350a1dd # Parent 0a8c1ba2b6fbe80cd738d8f3293704d683613971 8165806: UnicastServerRef support to export an object with a filter Reviewed-by: dfuchs diff -r 0a8c1ba2b6fb -r 3f8807f6fec3 jdk/src/java.rmi/share/classes/sun/rmi/server/UnicastServerRef.java --- a/jdk/src/java.rmi/share/classes/sun/rmi/server/UnicastServerRef.java Tue Oct 04 13:45:42 2016 -0400 +++ b/jdk/src/java.rmi/share/classes/sun/rmi/server/UnicastServerRef.java Tue Oct 04 14:18:54 2016 -0400 @@ -27,6 +27,8 @@ import java.io.IOException; import java.io.ObjectInput; +import java.io.ObjectInputFilter; +import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectStreamClass; import java.lang.reflect.InvocationTargetException; @@ -62,6 +64,10 @@ * UnicastServerRef implements the remote reference layer server-side * behavior for remote objects exported with the "UnicastRef" reference * type. + * If an {@link ObjectInputFilter ObjectInputFilter} is supplied it is + * invoked during deserialization to filter the arguments, + * otherwise the default filter of {@link ObjectInputStream ObjectInputStream} + * applies. * * @author Ann Wollrath * @author Roger Riggs @@ -103,6 +109,9 @@ */ private transient Skeleton skel; + // The ObjectInputFilter for checking the invocation arguments + private final transient ObjectInputFilter filter; + /** maps method hash to Method object for each remote method */ private transient Map<Long,Method> hashToMethod_Map = null; @@ -121,16 +130,29 @@ /** * Create a new (empty) Unicast server remote reference. + * The filter is null to defer to the default ObjectInputStream filter, if any. */ public UnicastServerRef() { + this.filter = null; } /** * Construct a Unicast server remote reference for a specified * liveRef. + * The filter is null to defer to the default ObjectInputStream filter, if any. */ public UnicastServerRef(LiveRef ref) { super(ref); + this.filter = null; + } + + /** + * Construct a Unicast server remote reference for a specified + * liveRef and filter. + */ + public UnicastServerRef(LiveRef ref, ObjectInputFilter filter) { + super(ref); + this.filter = filter; } /** @@ -139,6 +161,7 @@ */ public UnicastServerRef(int port) { super(new LiveRef(port)); + this.filter = null; } /** @@ -363,9 +386,23 @@ } } + /** + * Sets a filter for invocation arguments, if a filter has been set. + * Called by dispatch before the arguments are read. + */ protected void unmarshalCustomCallData(ObjectInput in) - throws IOException, ClassNotFoundException - {} + throws IOException, ClassNotFoundException { + if (filter != null && + in instanceof ObjectInputStream) { + // Set the filter on the stream + ObjectInputStream ois = (ObjectInputStream) in; + + AccessController.doPrivileged((PrivilegedAction<Void>)() -> { + ois.setObjectInputFilter(filter); + return null; + }); + } + } /** * Handle server-side dispatch using the RMI 1.1 stub/skeleton diff -r 0a8c1ba2b6fb -r 3f8807f6fec3 jdk/src/java.rmi/share/classes/sun/rmi/server/UnicastServerRef2.java --- a/jdk/src/java.rmi/share/classes/sun/rmi/server/UnicastServerRef2.java Tue Oct 04 13:45:42 2016 -0400 +++ b/jdk/src/java.rmi/share/classes/sun/rmi/server/UnicastServerRef2.java Tue Oct 04 14:18:54 2016 -0400 @@ -25,12 +25,13 @@ package sun.rmi.server; -import java.io.IOException; +import java.io.ObjectInputFilter; import java.io.ObjectOutput; -import java.rmi.*; -import java.rmi.server.*; -import sun.rmi.transport.*; -import sun.rmi.transport.tcp.*; +import java.rmi.server.RMIClientSocketFactory; +import java.rmi.server.RMIServerSocketFactory; +import java.rmi.server.RemoteRef; + +import sun.rmi.transport.LiveRef; /** * Server-side ref for a remote impl that uses a custom socket factory. @@ -59,6 +60,16 @@ } /** + * Construct a Unicast server remote reference for a specified + * liveRef and filter. + */ + public UnicastServerRef2(LiveRef ref, + ObjectInputFilter filter) + { + super(ref, filter); + } + + /** * Construct a Unicast server remote reference to be exported * on the specified port. */ @@ -70,6 +81,18 @@ } /** + * Construct a Unicast server remote reference to be exported + * on the specified port. + */ + public UnicastServerRef2(int port, + RMIClientSocketFactory csf, + RMIServerSocketFactory ssf, + ObjectInputFilter filter) + { + super(new LiveRef(port, csf, ssf), filter); + } + + /** * Returns the class of the ref type to be serialized */ public String getRefClass(ObjectOutput out)