diff options
author | Benoit Foucher <benoit@zeroc.com> | 2008-01-09 21:27:15 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2008-01-09 21:27:15 +0100 |
commit | 5b2cdfebdd59ca3f99eb306e0ccf775fc0a81b83 (patch) | |
tree | 3414c09ed68bbbda6d446a76c552e065c9e91108 /java/src | |
parent | Added info on mcpp (diff) | |
download | ice-5b2cdfebdd59ca3f99eb306e0ccf775fc0a81b83.tar.bz2 ice-5b2cdfebdd59ca3f99eb306e0ccf775fc0a81b83.tar.xz ice-5b2cdfebdd59ca3f99eb306e0ccf775fc0a81b83.zip |
- Fixed bug 1619, part of 2632.
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/Ice/AMI_Object_ice_invoke.java | 1 | ||||
-rw-r--r-- | java/src/Ice/Blobject.java | 7 | ||||
-rw-r--r-- | java/src/Ice/BlobjectAsync.java | 7 | ||||
-rw-r--r-- | java/src/Ice/InputStream.java | 1 | ||||
-rw-r--r-- | java/src/Ice/InputStreamI.java | 6 | ||||
-rw-r--r-- | java/src/Ice/ObjectAdapterI.java | 10 | ||||
-rw-r--r-- | java/src/Ice/ObjectImpl.java | 11 | ||||
-rw-r--r-- | java/src/Ice/_ObjectDelM.java | 58 | ||||
-rw-r--r-- | java/src/IceInternal/BasicStream.java | 50 | ||||
-rw-r--r-- | java/src/IceInternal/Incoming.java | 9 | ||||
-rw-r--r-- | java/src/IceInternal/Outgoing.java | 28 | ||||
-rw-r--r-- | java/src/IceInternal/OutgoingAsync.java | 17 |
12 files changed, 139 insertions, 66 deletions
diff --git a/java/src/Ice/AMI_Object_ice_invoke.java b/java/src/Ice/AMI_Object_ice_invoke.java index b891e74375a..7a4f0074c0a 100644 --- a/java/src/Ice/AMI_Object_ice_invoke.java +++ b/java/src/Ice/AMI_Object_ice_invoke.java @@ -38,6 +38,7 @@ public abstract class AMI_Object_ice_invoke extends IceInternal.OutgoingAsync { int sz = __is.getReadEncapsSize(); outParams = __is.readBlob(sz); + __is.endReadEncaps(); } catch(LocalException ex) { diff --git a/java/src/Ice/Blobject.java b/java/src/Ice/Blobject.java index daadab0654c..c5b348e39ce 100644 --- a/java/src/Ice/Blobject.java +++ b/java/src/Ice/Blobject.java @@ -20,8 +20,11 @@ public abstract class Blobject extends Ice.ObjectImpl { byte[] inParams; ByteSeqHolder outParams = new ByteSeqHolder(); - int sz = in.is().getReadEncapsSize(); - inParams = in.is().readBlob(sz); + IceInternal.BasicStream is = in.is(); + is.startReadEncaps(); + int sz = is.getReadEncapsSize(); + inParams = is.readBlob(sz); + is.endReadEncaps(); boolean ok = ice_invoke(inParams, outParams, current); if(outParams.value != null) { diff --git a/java/src/Ice/BlobjectAsync.java b/java/src/Ice/BlobjectAsync.java index 50288c12a50..e8679631ef6 100644 --- a/java/src/Ice/BlobjectAsync.java +++ b/java/src/Ice/BlobjectAsync.java @@ -18,8 +18,11 @@ public abstract class BlobjectAsync extends Ice.ObjectImpl __dispatch(IceInternal.Incoming in, Current current) { byte[] inParams; - int sz = in.is().getReadEncapsSize(); - inParams = in.is().readBlob(sz); + IceInternal.BasicStream is = in.is(); + is.startReadEncaps(); + int sz = is.getReadEncapsSize(); + inParams = is.readBlob(sz); + is.endReadEncaps(); AMD_Object_ice_invoke cb = new _AMD_Object_ice_invoke(in); try { diff --git a/java/src/Ice/InputStream.java b/java/src/Ice/InputStream.java index 60d7aab5615..8d882fec59f 100644 --- a/java/src/Ice/InputStream.java +++ b/java/src/Ice/InputStream.java @@ -54,6 +54,7 @@ public interface InputStream void skipSlice(); void startEncapsulation(); + void skipEncapsulation(); void endEncapsulation(); void readPendingObjects(); diff --git a/java/src/Ice/InputStreamI.java b/java/src/Ice/InputStreamI.java index eaa75550cf9..2024c8c99bc 100644 --- a/java/src/Ice/InputStreamI.java +++ b/java/src/Ice/InputStreamI.java @@ -211,6 +211,12 @@ public class InputStreamI implements InputStream } public void + skipEncapsulation() + { + _is.skipEncaps(); + } + + public void endEncapsulation() { _is.endReadEncaps(); diff --git a/java/src/Ice/ObjectAdapterI.java b/java/src/Ice/ObjectAdapterI.java index 7ca631d61d5..38bcab3e208 100644 --- a/java/src/Ice/ObjectAdapterI.java +++ b/java/src/Ice/ObjectAdapterI.java @@ -680,10 +680,14 @@ public final class ObjectAdapterI implements ObjectAdapter { for(int i = 0; i < endpoints.length; ++i) { - // _routerEndpoints is sorted. - if(java.util.Collections.binarySearch(_routerEndpoints, endpoints[i]) >= 0) + java.util.Iterator p; + p = _routerEndpoints.iterator(); + while(p.hasNext()) { - return true; + if(endpoints[i].equivalent((IceInternal.EndpointI)p.next())) + { + return true; + } } } } diff --git a/java/src/Ice/ObjectImpl.java b/java/src/Ice/ObjectImpl.java index dfca5d6b3f3..af589d40da7 100644 --- a/java/src/Ice/ObjectImpl.java +++ b/java/src/Ice/ObjectImpl.java @@ -58,9 +58,11 @@ public abstract class ObjectImpl implements Object, java.lang.Cloneable ___ice_isA(Ice.Object __obj, IceInternal.Incoming __inS, Current __current) { IceInternal.BasicStream __is = __inS.is(); - IceInternal.BasicStream __os = __inS.os(); + __is.startReadEncaps(); String __id = __is.readString(); + __is.endReadEncaps(); boolean __ret = __obj.ice_isA(__id, __current); + IceInternal.BasicStream __os = __inS.os(); __os.writeBool(__ret); return DispatchStatus.DispatchOK; } @@ -80,6 +82,7 @@ public abstract class ObjectImpl implements Object, java.lang.Cloneable public static DispatchStatus ___ice_ping(Ice.Object __obj, IceInternal.Incoming __inS, Current __current) { + __inS.is().skipEmptyEncaps(); __obj.ice_ping(__current); return DispatchStatus.DispatchOK; } @@ -99,8 +102,9 @@ public abstract class ObjectImpl implements Object, java.lang.Cloneable public static DispatchStatus ___ice_ids(Ice.Object __obj, IceInternal.Incoming __inS, Current __current) { - IceInternal.BasicStream __os = __inS.os(); + __inS.is().skipEmptyEncaps(); String[] __ret = __obj.ice_ids(__current); + IceInternal.BasicStream __os = __inS.os(); __os.writeStringSeq(__ret); return DispatchStatus.DispatchOK; } @@ -120,8 +124,9 @@ public abstract class ObjectImpl implements Object, java.lang.Cloneable public static DispatchStatus ___ice_id(Ice.Object __obj, IceInternal.Incoming __inS, Current __current) { - IceInternal.BasicStream __os = __inS.os(); + __inS.is().skipEmptyEncaps(); String __ret = __obj.ice_id(__current); + IceInternal.BasicStream __os = __inS.os(); __os.writeString(__ret); return DispatchStatus.DispatchOK; } diff --git a/java/src/Ice/_ObjectDelM.java b/java/src/Ice/_ObjectDelM.java index a060df4fae3..297cfd8ac63 100644 --- a/java/src/Ice/_ObjectDelM.java +++ b/java/src/Ice/_ObjectDelM.java @@ -30,19 +30,22 @@ public class _ObjectDelM implements _ObjectDel boolean __ok = __og.invoke(); try { - IceInternal.BasicStream __is = __og.is(); if(!__ok) { try { - __is.throwException(); + __og.throwUserException(); } catch(UserException __ex) { throw new UnknownUserException(__ex.ice_name()); } } - return __is.readBool(); + IceInternal.BasicStream __is = __og.is(); + __is.startReadEncaps(); + boolean __ret = __is.readBool(); + __is.endReadEncaps(); + return __ret; } catch(LocalException __ex) { @@ -63,24 +66,27 @@ public class _ObjectDelM implements _ObjectDel try { boolean __ok = __og.invoke(); - try + if(!__og.is().isEmpty()) { - IceInternal.BasicStream __is = __og.is(); - if(!__ok) + try { - try - { - __is.throwException(); - } - catch(UserException __ex) + if(!__ok) { - throw new UnknownUserException(__ex.ice_name()); + try + { + __og.throwUserException(); + } + catch(UserException __ex) + { + throw new UnknownUserException(__ex.ice_name()); + } } + __og.is().skipEmptyEncaps(); + } + catch(LocalException __ex) + { + throw new IceInternal.LocalExceptionWrapper(__ex, false); } - } - catch(LocalException __ex) - { - throw new IceInternal.LocalExceptionWrapper(__ex, false); } } finally @@ -99,19 +105,22 @@ public class _ObjectDelM implements _ObjectDel boolean __ok = __og.invoke(); try { - IceInternal.BasicStream __is = __og.is(); if(!__ok) { try { - __is.throwException(); + __og.throwUserException(); } catch(UserException __ex) { throw new UnknownUserException(__ex.ice_name()); } } - return __is.readStringSeq(); + IceInternal.BasicStream __is = __og.is(); + __is.startReadEncaps(); + String[] __ret = __is.readStringSeq(); + __is.endReadEncaps(); + return __ret; } catch(LocalException __ex) { @@ -134,19 +143,22 @@ public class _ObjectDelM implements _ObjectDel boolean __ok = __og.invoke(); try { - IceInternal.BasicStream __is = __og.is(); if(!__ok) { try { - __is.throwException(); + __og.throwUserException(); } catch(UserException __ex) { throw new UnknownUserException(__ex.ice_name()); } } - return __is.readString(); + IceInternal.BasicStream __is = __og.is(); + __is.startReadEncaps(); + String __ret = __is.readString(); + __is.endReadEncaps(); + return __ret; } catch(LocalException __ex) { @@ -184,11 +196,13 @@ public class _ObjectDelM implements _ObjectDel try { IceInternal.BasicStream __is = __og.is(); + __is.startReadEncaps(); int sz = __is.getReadEncapsSize(); if(outParams != null) { outParams.value = __is.readBlob(sz); } + __is.endReadEncaps(); } catch(LocalException __ex) { diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java index 16409506b80..f55c45b7669 100644 --- a/java/src/IceInternal/BasicStream.java +++ b/java/src/IceInternal/BasicStream.java @@ -422,15 +422,27 @@ public class BasicStream endReadEncaps() { assert(_readEncapsStack != null); - int start = _readEncapsStack.start; - int sz = _readEncapsStack.sz; - try - { - _buf.b.position(start + sz); - } - catch(IllegalArgumentException ex) + if(_buf.b.position() != _readEncapsStack.start + _readEncapsStack.sz) { - throw new Ice.UnmarshalOutOfBoundsException(); + if(_buf.b.position() + 1 != _readEncapsStack.start + _readEncapsStack.sz) + { + throw new Ice.EncapsulationException(); + } + + // + // Ice version < 3.3 had a bug where user exceptions with + // class members could be encoded with a trailing byte + // when dispatched with AMD. So we tolerate an extra byte + // in the encapsulation. + // + try + { + _buf.b.get(); + } + catch(java.nio.BufferUnderflowException ex) + { + throw new Ice.UnmarshalOutOfBoundsException(); + } } ReadEncaps curr = _readEncapsStack; @@ -441,15 +453,27 @@ public class BasicStream } public void - checkReadEncaps() + skipEmptyEncaps() { - assert(_readEncapsStack != null); - int start = _readEncapsStack.start; - int sz = _readEncapsStack.sz; - if(_buf.b.position() != start + sz) + int sz = readInt(); + if(sz < 0) + { + throw new Ice.NegativeSizeException(); + } + + if(sz != 6) { throw new Ice.EncapsulationException(); } + + try + { + _buf.b.position(_buf.b.position() + 2); + } + catch(IllegalArgumentException ex) + { + throw new Ice.UnmarshalOutOfBoundsException(); + } } public int diff --git a/java/src/IceInternal/Incoming.java b/java/src/IceInternal/Incoming.java index f55af36735b..30b149fa707 100644 --- a/java/src/IceInternal/Incoming.java +++ b/java/src/IceInternal/Incoming.java @@ -103,8 +103,6 @@ final public class Incoming extends IncomingBase implements Ice.Request _current.ctx.put(first, second); } - _is.startReadEncaps(); - if(_response) { assert(_os.size() == Protocol.headerSize + 4); // Reply status position. @@ -197,7 +195,6 @@ final public class Incoming extends IncomingBase implements Ice.Request } catch(java.lang.Exception ex) { - _is.endReadEncaps(); __handleException(ex); return; } @@ -208,8 +205,6 @@ final public class Incoming extends IncomingBase implements Ice.Request // the caller of this operation. // - _is.endReadEncaps(); - // // DispatchAsync is "pseudo dispatch status", used internally // only to indicate async dispatch. @@ -306,7 +301,7 @@ final public class Incoming extends IncomingBase implements Ice.Request // // That's the first startOver, so almost nothing to do // - _inParamPos = _is.pos() - 6; // 6 bytes for the start of the encaps + _inParamPos = _is.pos(); } else { @@ -315,9 +310,7 @@ final public class Incoming extends IncomingBase implements Ice.Request // // Let's rewind _is and clean-up _os // - _is.endReadEncaps(); _is.pos(_inParamPos); - _is.startReadEncaps(); if(_response) { diff --git a/java/src/IceInternal/Outgoing.java b/java/src/IceInternal/Outgoing.java index d5288310ebe..97a00eb0597 100644 --- a/java/src/IceInternal/Outgoing.java +++ b/java/src/IceInternal/Outgoing.java @@ -292,24 +292,12 @@ public final class Outgoing implements OutgoingMessageCallback { case ReplyStatus.replyOK: { - // - // Input and output parameters are always sent in an - // encapsulation, which makes it possible to forward - // oneway requests as blobs. - // - _is.startReadEncaps(); _state = StateOK; // The state must be set last, in case there is an exception. break; } case ReplyStatus.replyUserException: { - // - // Input and output parameters are always sent in an - // encapsulation, which makes it possible to forward - // oneway requests as blobs. - // - _is.startReadEncaps(); _state = StateUserException; // The state must be set last, in case there is an exception. break; } @@ -444,6 +432,22 @@ public final class Outgoing implements OutgoingMessageCallback return _os; } + public void + throwUserException() + throws Ice.UserException + { + try + { + _is.startReadEncaps(); + _is.throwException(); + } + catch(Ice.UserException ex) + { + _is.endReadEncaps(); + throw ex; + } + } + private void writeHeader(String operation, Ice.OperationMode mode, java.util.Map context) throws LocalExceptionWrapper diff --git a/java/src/IceInternal/OutgoingAsync.java b/java/src/IceInternal/OutgoingAsync.java index 29ce96039af..6d354f23885 100644 --- a/java/src/IceInternal/OutgoingAsync.java +++ b/java/src/IceInternal/OutgoingAsync.java @@ -79,7 +79,6 @@ public abstract class OutgoingAsync extends OutgoingAsyncMessageCallback case ReplyStatus.replyOK: case ReplyStatus.replyUserException: { - __is.startReadEncaps(); break; } @@ -368,6 +367,22 @@ public abstract class OutgoingAsync extends OutgoingAsyncMessageCallback protected abstract void __response(boolean ok); + protected void + __throwUserException() + throws Ice.UserException + { + try + { + __is.startReadEncaps(); + __is.throwException(); + } + catch(Ice.UserException ex) + { + __is.endReadEncaps(); + throw ex; + } + } + private void handleException(LocalExceptionWrapper ex) { |