diff options
Diffstat (limited to 'java')
8 files changed, 88 insertions, 27 deletions
diff --git a/java/src/Ice/src/main/java/Ice/ConnectionI.java b/java/src/Ice/src/main/java/Ice/ConnectionI.java index cfef2312b11..57ec2b58b49 100644 --- a/java/src/Ice/src/main/java/Ice/ConnectionI.java +++ b/java/src/Ice/src/main/java/Ice/ConnectionI.java @@ -1103,9 +1103,9 @@ public final class ConnectionI extends IceInternal.EventHandler { throw new Ice.IllegalMessageSizeException(); } - if(size > _instance.messageSizeMax()) + if(size > _messageSizeMax) { - IceInternal.Ex.throwMemoryLimitException(size, _instance.messageSizeMax()); + IceInternal.Ex.throwMemoryLimitException(size, _messageSizeMax); } if(size > _readStream.size()) { @@ -1625,8 +1625,8 @@ public final class ConnectionI extends IceInternal.EventHandler } public ConnectionI(Communicator communicator, IceInternal.Instance instance, IceInternal.ACMMonitor monitor, - IceInternal.Transceiver transceiver, IceInternal.Connector connector, IceInternal.EndpointI endpoint, - ObjectAdapter adapter) + IceInternal.Transceiver transceiver, IceInternal.Connector connector, + IceInternal.EndpointI endpoint, ObjectAdapterI adapter) { _communicator = communicator; _instance = instance; @@ -1659,6 +1659,7 @@ public final class ConnectionI extends IceInternal.EventHandler _acmLastActivity = -1; } _nextRequestId = 1; + _messageSizeMax = adapter != null ? adapter.messageSizeMax() : instance.messageSizeMax(); _batchAutoFlushSize = _instance.batchAutoFlushSize(); _batchStream = new IceInternal.BasicStream(instance, IceInternal.Protocol.currentProtocolEncoding); _batchStreamInUse = false; @@ -1684,9 +1685,9 @@ public final class ConnectionI extends IceInternal.EventHandler } _compressionLevel = compressionLevel; - if(_adapter != null) + if(adapter != null) { - _servantManager = ((ObjectAdapterI) _adapter).getServantManager(); + _servantManager = adapter.getServantManager(); } else { @@ -1695,9 +1696,9 @@ public final class ConnectionI extends IceInternal.EventHandler try { - if(_adapter != null) + if(adapter != null) { - _threadPool = ((ObjectAdapterI) _adapter).getThreadPool(); + _threadPool = adapter.getThreadPool(); } else { @@ -2518,7 +2519,7 @@ public final class ConnectionI extends IceInternal.EventHandler { if(IceInternal.BasicStream.compressible()) { - info.stream = info.stream.uncompress(IceInternal.Protocol.headerSize); + info.stream = info.stream.uncompress(IceInternal.Protocol.headerSize, _messageSizeMax); } else { @@ -3120,7 +3121,8 @@ public final class ConnectionI extends IceInternal.EventHandler private LocalException _exception; - private int _batchAutoFlushSize; + private final int _messageSizeMax; + private final int _batchAutoFlushSize; private IceInternal.BasicStream _batchStream; private boolean _batchStreamInUse; private int _batchRequestNum; diff --git a/java/src/Ice/src/main/java/Ice/ObjectAdapterI.java b/java/src/Ice/src/main/java/Ice/ObjectAdapterI.java index 9837175bccc..d00a347731a 100644 --- a/java/src/Ice/src/main/java/Ice/ObjectAdapterI.java +++ b/java/src/Ice/src/main/java/Ice/ObjectAdapterI.java @@ -857,6 +857,13 @@ public final class ObjectAdapterI implements ObjectAdapter return _acm; } + public int + messageSizeMax() + { + // No mutex lock, immutable. + return _messageSizeMax; + } + // // Only for use by IceInternal.ObjectAdapterFactory // @@ -879,6 +886,7 @@ public final class ObjectAdapterI implements ObjectAdapter _replicaGroupId = ""; _reference = _instance.referenceFactory().create("dummy -t", ""); _acm = _instance.serverACM(); + _messageSizeMax = _instance.messageSizeMax(); return; } @@ -940,6 +948,19 @@ public final class ObjectAdapterI implements ObjectAdapter _acm = new IceInternal.ACMConfig(properties, communicator.getLogger(), _name + ".ACM", instance.serverACM()); + { + final int defaultMessageSizeMax = instance.messageSizeMax() / 1024; + int num = properties.getPropertyAsIntWithDefault(_name + ".MessageSizeMax", defaultMessageSizeMax); + if(num < 1 || num > 0x7fffffff / 1024) + { + _messageSizeMax = 0x7fffffff; + } + else + { + _messageSizeMax = num * 1024; // Property is in kilobytes, _messageSizeMax in bytes + } + } + try { int threadPoolSize = properties.getPropertyAsInt(_name + ".ThreadPool.Size"); @@ -1519,6 +1540,7 @@ public final class ObjectAdapterI implements ObjectAdapter "Locator.PreferSecure", "Locator.CollocationOptimized", "Locator.Router", + "MessageSizeMax", "PublishedEndpoints", "RegisterProcess", "ReplicaGroupId", @@ -1614,4 +1636,5 @@ public final class ObjectAdapterI implements ObjectAdapter private int _directCount; // The number of direct proxies dispatching on this object adapter. private boolean _noConfig; private Identity _processId = null; + private final int _messageSizeMax; } diff --git a/java/src/Ice/src/main/java/IceInternal/BasicStream.java b/java/src/Ice/src/main/java/IceInternal/BasicStream.java index 82d84110cb9..58620c59170 100644 --- a/java/src/Ice/src/main/java/IceInternal/BasicStream.java +++ b/java/src/Ice/src/main/java/IceInternal/BasicStream.java @@ -1,4 +1,3 @@ - // ********************************************************************** // // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. @@ -2637,7 +2636,7 @@ public class BasicStream } public BasicStream - uncompress(int headerSize) + uncompress(int headerSize, int messageSizeMax) { assert(compressible()); @@ -2647,9 +2646,9 @@ public class BasicStream { throw new Ice.IllegalMessageSizeException(); } - if(uncompressedSize > _instance.messageSizeMax()) + if(uncompressedSize > messageSizeMax) { - IceInternal.Ex.throwMemoryLimitException(uncompressedSize, _instance.messageSizeMax()); + IceInternal.Ex.throwMemoryLimitException(uncompressedSize, messageSizeMax); } int compressedLen = size() - headerSize - 4; diff --git a/java/src/Ice/src/main/java/IceInternal/IncomingConnectionFactory.java b/java/src/Ice/src/main/java/IceInternal/IncomingConnectionFactory.java index e1d3daa6b18..e0a62027edf 100644 --- a/java/src/Ice/src/main/java/IceInternal/IncomingConnectionFactory.java +++ b/java/src/Ice/src/main/java/IceInternal/IncomingConnectionFactory.java @@ -363,14 +363,14 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice } public - IncomingConnectionFactory(Instance instance, EndpointI endpoint, Ice.ObjectAdapter adapter, String adapterName) + IncomingConnectionFactory(Instance instance, EndpointI endpoint, Ice.ObjectAdapterI adapter, String adapterName) { _instance = instance; _endpoint = endpoint; _adapter = adapter; _warn = _instance.initializationData().properties.getPropertyAsInt("Ice.Warn.Connections") > 0 ? true : false; _state = StateHolding; - _monitor = new FactoryACMMonitor(instance, ((Ice.ObjectAdapterI)adapter).getACM()); + _monitor = new FactoryACMMonitor(instance, adapter.getACM()); DefaultsAndOverrides defaultsAndOverrides = _instance.defaultsAndOverrides(); if(defaultsAndOverrides.overrideTimeout) @@ -430,7 +430,7 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); } - ((Ice.ObjectAdapterI)_adapter).getThreadPool().initialize(this); + _adapter.getThreadPool().initialize(this); } } catch(java.lang.Exception ex) @@ -531,7 +531,7 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice s.append(_acceptor.toString()); _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); } - ((Ice.ObjectAdapterI)_adapter).getThreadPool().register(this, SocketOperation.Read); + _adapter.getThreadPool().register(this, SocketOperation.Read); } for(Ice.ConnectionI connection : _connections) @@ -557,7 +557,7 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice s.append(_acceptor.toString()); _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); } - ((Ice.ObjectAdapterI)_adapter).getThreadPool().unregister(this, SocketOperation.Read); + _adapter.getThreadPool().unregister(this, SocketOperation.Read); } for(Ice.ConnectionI connection : _connections) @@ -577,7 +577,7 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice // if there are no more threads in the thread pool available to dispatch // the finish() call. // - if(((Ice.ObjectAdapterI)_adapter).getThreadPool().finish(this, true)) + if(_adapter.getThreadPool().finish(this, true)) { closeAcceptor(true); } @@ -633,7 +633,7 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice private Transceiver _transceiver; private EndpointI _endpoint; - private Ice.ObjectAdapter _adapter; + private Ice.ObjectAdapterI _adapter; private final boolean _warn; diff --git a/java/src/Ice/src/main/java/IceInternal/Instance.java b/java/src/Ice/src/main/java/IceInternal/Instance.java index 8085635ad04..ebe7dd118df 100644 --- a/java/src/Ice/src/main/java/IceInternal/Instance.java +++ b/java/src/Ice/src/main/java/IceInternal/Instance.java @@ -892,11 +892,7 @@ public final class Instance { final int defaultMessageSizeMax = 1024; int num = _initData.properties.getPropertyAsIntWithDefault("Ice.MessageSizeMax", defaultMessageSizeMax); - if(num < 1) - { - _messageSizeMax = defaultMessageSizeMax * 1024; // Ignore non-sensical values. - } - else if(num > 0x7fffffff / 1024) + if(num < 1 || num > 0x7fffffff / 1024) { _messageSizeMax = 0x7fffffff; } diff --git a/java/test/src/main/java/test/Ice/exceptions/AMDServer.java b/java/test/src/main/java/test/Ice/exceptions/AMDServer.java index 2863c0fa5dc..0ee384ac865 100644 --- a/java/test/src/main/java/test/Ice/exceptions/AMDServer.java +++ b/java/test/src/main/java/test/Ice/exceptions/AMDServer.java @@ -16,9 +16,15 @@ public class AMDServer extends test.Util.Application { Ice.Communicator communicator = communicator(); Ice.ObjectAdapter adapter = communicator.createObjectAdapter("TestAdapter"); - Ice.Object object = new AMDThrowerI(); + Ice.ObjectAdapter adapter2 = communicator.createObjectAdapter("TestAdapter2"); + Ice.ObjectAdapter adapter3 = communicator.createObjectAdapter("TestAdapter3"); + Ice.Object object = new ThrowerI(); adapter.add(object, communicator.stringToIdentity("thrower")); + adapter2.add(object, communicator.stringToIdentity("thrower")); + adapter3.add(object, communicator.stringToIdentity("thrower")); adapter.activate(); + adapter2.activate(); + adapter3.activate(); return WAIT; } @@ -38,6 +44,10 @@ public class AMDServer extends test.Util.Application initData.properties.setProperty("Ice.Package.Test", "test.Ice.exceptions.AMD"); initData.properties.setProperty("TestAdapter.Endpoints", "default -p 12010:udp"); initData.properties.setProperty("Ice.MessageSizeMax", "10"); // 10KB max + initData.properties.setProperty("TestAdapter2.Endpoints", "default -p 12011"); + initData.properties.setProperty("TestAdapter2.MessageSizeMax", "0"); + initData.properties.setProperty("TestAdapter3.Endpoints", "default -p 12012"); + initData.properties.setProperty("TestAdapter3.MessageSizeMax", "1"); return initData; } diff --git a/java/test/src/main/java/test/Ice/exceptions/AllTests.java b/java/test/src/main/java/test/Ice/exceptions/AllTests.java index e66e96cbda5..c9ff44cab46 100644 --- a/java/test/src/main/java/test/Ice/exceptions/AllTests.java +++ b/java/test/src/main/java/test/Ice/exceptions/AllTests.java @@ -1134,6 +1134,27 @@ public class AllTests ex.printStackTrace(); test(false); } + + ThrowerPrx thrower2 = ThrowerPrxHelper.uncheckedCast( + communicator.stringToProxy("thrower:default -p 12011")); + try + { + thrower2.throwMemoryLimitException(new byte[2 * 1024 * 1024]); // 2MB (no limits) + } + catch(Ice.MemoryLimitException ex) + { + } + ThrowerPrx thrower3 = ThrowerPrxHelper.uncheckedCast( + communicator.stringToProxy("thrower:default -p 12012")); + try + { + thrower3.throwMemoryLimitException(new byte[1024]); // 1KB limit + test(false); + } + catch(Ice.ConnectionLostException ex) + { + } + out.println("ok"); } diff --git a/java/test/src/main/java/test/Ice/exceptions/Server.java b/java/test/src/main/java/test/Ice/exceptions/Server.java index 6ecdc901099..bb0140e0a5d 100644 --- a/java/test/src/main/java/test/Ice/exceptions/Server.java +++ b/java/test/src/main/java/test/Ice/exceptions/Server.java @@ -16,9 +16,15 @@ public class Server extends test.Util.Application { Ice.Communicator communicator = communicator(); Ice.ObjectAdapter adapter = communicator.createObjectAdapter("TestAdapter"); + Ice.ObjectAdapter adapter2 = communicator.createObjectAdapter("TestAdapter2"); + Ice.ObjectAdapter adapter3 = communicator.createObjectAdapter("TestAdapter3"); Ice.Object object = new ThrowerI(); adapter.add(object, communicator.stringToIdentity("thrower")); + adapter2.add(object, communicator.stringToIdentity("thrower")); + adapter3.add(object, communicator.stringToIdentity("thrower")); adapter.activate(); + adapter2.activate(); + adapter3.activate(); return WAIT; } @@ -38,6 +44,10 @@ public class Server extends test.Util.Application initData.properties.setProperty("Ice.Package.Test", "test.Ice.exceptions"); initData.properties.setProperty("TestAdapter.Endpoints", "default -p 12010:udp"); initData.properties.setProperty("Ice.MessageSizeMax", "10"); // 10KB max + initData.properties.setProperty("TestAdapter2.Endpoints", "default -p 12011"); + initData.properties.setProperty("TestAdapter2.MessageSizeMax", "0"); + initData.properties.setProperty("TestAdapter3.Endpoints", "default -p 12012"); + initData.properties.setProperty("TestAdapter3.MessageSizeMax", "1"); return initData; } |