aboutsummaryrefslogtreecommitdiff
path: root/src/share/classes/sun/rmi/transport
diff options
context:
space:
mode:
Diffstat (limited to 'src/share/classes/sun/rmi/transport')
-rw-r--r--src/share/classes/sun/rmi/transport/DGCImpl_Skel.java17
-rw-r--r--src/share/classes/sun/rmi/transport/DGCImpl_Stub.java50
-rw-r--r--src/share/classes/sun/rmi/transport/StreamRemoteCall.java22
3 files changed, 59 insertions, 30 deletions
diff --git a/src/share/classes/sun/rmi/transport/DGCImpl_Skel.java b/src/share/classes/sun/rmi/transport/DGCImpl_Skel.java
index f991a6e053..1b413cffc1 100644
--- a/src/share/classes/sun/rmi/transport/DGCImpl_Skel.java
+++ b/src/share/classes/sun/rmi/transport/DGCImpl_Skel.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2019, 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
@@ -25,6 +25,8 @@
package sun.rmi.transport;
+import java.io.IOException;
+
/**
* Skeleton to dispatch DGC methods.
* Originally generated by RMIC but frozen to match the stubs.
@@ -43,12 +45,13 @@ public final class DGCImpl_Skel
return operations.clone();
}
- public void dispatch(java.rmi.Remote obj, java.rmi.server.RemoteCall call, int opnum, long hash)
+ public void dispatch(java.rmi.Remote obj, java.rmi.server.RemoteCall remoteCall, int opnum, long hash)
throws java.lang.Exception {
if (hash != interfaceHash)
throw new java.rmi.server.SkeletonMismatchException("interface hash mismatch");
sun.rmi.transport.DGCImpl server = (sun.rmi.transport.DGCImpl) obj;
+ StreamRemoteCall call = (StreamRemoteCall) remoteCall;
switch (opnum) {
case 0: // clean(ObjID[], long, VMID, boolean)
{
@@ -62,9 +65,8 @@ public final class DGCImpl_Skel
$param_long_2 = in.readLong();
$param_VMID_3 = (java.rmi.dgc.VMID) in.readObject();
$param_boolean_4 = in.readBoolean();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling arguments", e);
- } catch (java.lang.ClassNotFoundException e) {
+ } catch (ClassCastException | IOException | ClassNotFoundException e) {
+ call.discardPendingRefs();
throw new java.rmi.UnmarshalException("error unmarshalling arguments", e);
} finally {
call.releaseInputStream();
@@ -88,9 +90,8 @@ public final class DGCImpl_Skel
$param_arrayOf_ObjID_1 = (java.rmi.server.ObjID[]) in.readObject();
$param_long_2 = in.readLong();
$param_Lease_3 = (java.rmi.dgc.Lease) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling arguments", e);
- } catch (java.lang.ClassNotFoundException e) {
+ } catch (ClassCastException | IOException | ClassNotFoundException e) {
+ call.discardPendingRefs();
throw new java.rmi.UnmarshalException("error unmarshalling arguments", e);
} finally {
call.releaseInputStream();
diff --git a/src/share/classes/sun/rmi/transport/DGCImpl_Stub.java b/src/share/classes/sun/rmi/transport/DGCImpl_Stub.java
index 11b862c636..7c402ae83c 100644
--- a/src/share/classes/sun/rmi/transport/DGCImpl_Stub.java
+++ b/src/share/classes/sun/rmi/transport/DGCImpl_Stub.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2019, 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
@@ -25,16 +25,15 @@
package sun.rmi.transport;
-import java.io.ObjectInputStream;
+import sun.rmi.transport.tcp.TCPConnection;
+
+import java.io.IOException;
import java.rmi.dgc.Lease;
import java.rmi.dgc.VMID;
import java.rmi.server.UID;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
+import java.util.ArrayList;
import sun.misc.ObjectInputFilter;
-import sun.rmi.server.UnicastRef;
-import sun.rmi.transport.tcp.TCPConnection;
/**
* Stubs to invoke DGC remote methods.
@@ -72,7 +71,9 @@ public final class DGCImpl_Stub
public void clean(java.rmi.server.ObjID[] $param_arrayOf_ObjID_1, long $param_long_2, java.rmi.dgc.VMID $param_VMID_3, boolean $param_boolean_4)
throws java.rmi.RemoteException {
try {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ StreamRemoteCall call = (StreamRemoteCall)ref.newCall((java.rmi.server.RemoteObject) this,
+ operations, 0, interfaceHash);
+ call.setObjectInputFilter(DGCImpl_Stub::leaseFilter);
try {
java.io.ObjectOutput out = call.getOutputStream();
out.writeObject($param_arrayOf_ObjID_1);
@@ -97,7 +98,10 @@ public final class DGCImpl_Stub
public java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[] $param_arrayOf_ObjID_1, long $param_long_2, java.rmi.dgc.Lease $param_Lease_3)
throws java.rmi.RemoteException {
try {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
+ StreamRemoteCall call =
+ (StreamRemoteCall)ref.newCall((java.rmi.server.RemoteObject) this,
+ operations, 1, interfaceHash);
+ call.setObjectInputFilter(DGCImpl_Stub::leaseFilter);
try {
java.io.ObjectOutput out = call.getOutputStream();
out.writeObject($param_arrayOf_ObjID_1);
@@ -108,26 +112,17 @@ public final class DGCImpl_Stub
}
ref.invoke(call);
java.rmi.dgc.Lease $result;
- Connection connection = ((StreamRemoteCall) call).getConnection();
+ Connection connection = call.getConnection();
try {
java.io.ObjectInput in = call.getInputStream();
- if (in instanceof ObjectInputStream) {
- /**
- * Set a filter on the stream for the return value.
- */
- ObjectInputStream ois = (ObjectInputStream) in;
- AccessController.doPrivileged((PrivilegedAction<Void>)() -> {
- ObjectInputFilter.Config.setObjectInputFilter(ois, DGCImpl_Stub::leaseFilter);
- return null;
- });
- }
$result = (java.rmi.dgc.Lease) in.readObject();
- } catch (java.io.IOException | java.lang.ClassNotFoundException e) {
+ } catch (ClassCastException | IOException | ClassNotFoundException e) {
if (connection instanceof TCPConnection) {
// Modified to prevent re-use of the connection after an exception
((TCPConnection) connection).getChannel().free(connection, false);
}
+ call.discardPendingRefs();
throw new java.rmi.UnmarshalException("error unmarshalling return", e);
} finally {
ref.done(call);
@@ -146,6 +141,10 @@ public final class DGCImpl_Stub
* ObjectInputFilter to filter DGCClient return value (a Lease).
* The list of acceptable classes is very short and explicit.
* The depth and array sizes are limited.
+ * <p>
+ * The filter must accept normal and exception returns.
+ * A DGC server may throw exceptions that may have a cause
+ * and suppressed exceptions.
*
* @param filterInfo access to class, arrayLength, etc.
* @return {@link ObjectInputFilter.Status#ALLOWED} if allowed,
@@ -172,7 +171,16 @@ public final class DGCImpl_Stub
}
return (clazz == UID.class ||
clazz == VMID.class ||
- clazz == Lease.class)
+ clazz == Lease.class ||
+ (Throwable.class.isAssignableFrom(clazz) &&
+ clazz.getClassLoader() ==
+ Object.class.getClassLoader()) ||
+ clazz == StackTraceElement.class ||
+ clazz == ArrayList.class || // for suppressed exceptions, if any
+ clazz == Object.class ||
+ clazz.getName().equals("java.util.Collections$UnmodifiableList") ||
+ clazz.getName().equals("java.util.Collections$UnmodifiableCollection") ||
+ clazz.getName().equals("java.util.Collections$UnmodifiableRandomAccessList"))
? ObjectInputFilter.Status.ALLOWED
: ObjectInputFilter.Status.REJECTED;
}
diff --git a/src/share/classes/sun/rmi/transport/StreamRemoteCall.java b/src/share/classes/sun/rmi/transport/StreamRemoteCall.java
index d0a0ced040..cb71f7478a 100644
--- a/src/share/classes/sun/rmi/transport/StreamRemoteCall.java
+++ b/src/share/classes/sun/rmi/transport/StreamRemoteCall.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2019, 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
@@ -36,6 +36,10 @@ import java.rmi.MarshalException;
import java.rmi.UnmarshalException;
import java.rmi.server.ObjID;
import java.rmi.server.RemoteCall;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import sun.misc.ObjectInputFilter;
import sun.rmi.runtime.Log;
import sun.rmi.server.UnicastRef;
import sun.rmi.transport.tcp.TCPEndpoint;
@@ -50,6 +54,7 @@ public class StreamRemoteCall implements RemoteCall {
private ConnectionInputStream in = null;
private ConnectionOutputStream out = null;
private Connection conn;
+ private ObjectInputFilter filter = null;
private boolean resultStarted = false;
private Exception serverException = null;
@@ -123,6 +128,13 @@ public class StreamRemoteCall implements RemoteCall {
}
}
+ public void setObjectInputFilter(ObjectInputFilter filter) {
+ if (in != null) {
+ throw new IllegalStateException("set filter must occur before calling getInputStream");
+ }
+ this.filter = filter;
+ }
+
/**
* Get the InputStream the stub/skeleton should get results/arguments
* from.
@@ -132,6 +144,12 @@ public class StreamRemoteCall implements RemoteCall {
Transport.transportLog.log(Log.VERBOSE, "getting input stream");
in = new ConnectionInputStream(conn.getInputStream());
+ if (filter != null) {
+ AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
+ ObjectInputFilter.Config.setObjectInputFilter(in, filter);
+ return null;
+ });
+ }
}
return in;
}
@@ -251,6 +269,7 @@ public class StreamRemoteCall implements RemoteCall {
try {
ex = in.readObject();
} catch (Exception e) {
+ discardPendingRefs();
throw new UnmarshalException("Error unmarshaling return", e);
}
@@ -259,6 +278,7 @@ public class StreamRemoteCall implements RemoteCall {
if (ex instanceof Exception) {
exceptionReceivedFromServer((Exception) ex);
} else {
+ discardPendingRefs();
throw new UnmarshalException("Return type not Exception");
}
// Exception is thrown before fallthrough can occur