QPID-7932: [Java Broker, AMQP 1.0] Improve Error handling for decoding invalid byte streams
Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/2402b637 Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/2402b637 Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/2402b637 Branch: refs/heads/master Commit: 2402b63796a0fb81455d6842669017676860e169 Parents: d4d408f Author: Lorenz Quack <lqu...@apache.org> Authored: Fri Sep 29 12:40:10 2017 +0100 Committer: Lorenz Quack <lqu...@apache.org> Committed: Fri Sep 29 13:32:00 2017 +0100 ---------------------------------------------------------------------- .../tuple/MessageMetaDataBinding.java | 2 +- .../server/bytebuffer/QpidByteBufferUtils.java | 5 + .../v1/MessageStoreSerializer_v1.java | 12 +- .../protocol/v1_0/MessageMetaData_1_0.java | 5 +- .../codec/AbstractCompositeTypeConstructor.java | 30 ++- .../v1_0/codec/ArrayTypeConstructor.java | 18 +- .../v1_0/codec/BinaryTypeConstructor.java | 18 +- .../protocol/v1_0/codec/BooleanConstructor.java | 5 +- .../v1_0/codec/ByteTypeConstructor.java | 13 +- .../v1_0/codec/CharTypeConstructor.java | 6 +- .../protocol/v1_0/codec/DecimalConstructor.java | 8 +- .../v1_0/codec/DoubleTypeConstructor.java | 10 +- .../v1_0/codec/FloatTypeConstructor.java | 12 +- .../protocol/v1_0/codec/IntTypeConstructor.java | 12 +- .../protocol/v1_0/codec/ListConstructor.java | 2 +- .../v1_0/codec/LongTypeConstructor.java | 12 +- .../protocol/v1_0/codec/MapConstructor.java | 28 +-- .../v1_0/codec/NullTypeConstructor.java | 2 +- .../v1_0/codec/ShortTypeConstructor.java | 12 +- .../v1_0/codec/SmallIntConstructor.java | 12 +- .../v1_0/codec/SmallLongConstructor.java | 12 +- .../v1_0/codec/SmallUIntConstructor.java | 12 +- .../v1_0/codec/SmallULongConstructor.java | 12 +- .../v1_0/codec/StringTypeConstructor.java | 33 ++-- .../v1_0/codec/SymbolTypeConstructor.java | 34 ++-- .../v1_0/codec/TimestampTypeConstructor.java | 8 +- .../v1_0/codec/UByteTypeConstructor.java | 13 +- .../v1_0/codec/UIntTypeConstructor.java | 13 +- .../v1_0/codec/ULongTypeConstructor.java | 13 +- .../v1_0/codec/UShortTypeConstructor.java | 14 +- .../v1_0/codec/UUIDTypeConstructor.java | 9 +- .../protocol/v1_0/codec/ValueHandler.java | 3 +- .../v1_0/codec/ZeroListConstructor.java | 2 +- .../v1_0/codec/ZeroUIntConstructor.java | 1 - .../v1_0/codec/ZeroULongConstructor.java | 2 +- .../protocol/v1_0/framing/FrameHandler.java | 3 +- .../protocol/v1_0/messaging/SectionDecoder.java | 3 - .../v1_0/messaging/SectionDecoderImpl.java | 8 - .../v1_0/type/messaging/AbstractSection.java | 7 + .../codec/AmqpValueSectionConstructor.java | 43 +++- .../messaging/codec/DataSectionConstructor.java | 14 +- .../codec/DescribedListSectionConstructor.java | 16 +- .../codec/DescribedMapSectionConstructor.java | 14 +- .../protocol/v1_0/codec/ValueHandlerTest.java | 196 +++++++++++++++++++ .../store/jdbc/AbstractJDBCMessageStore.java | 2 +- 45 files changed, 473 insertions(+), 238 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java ---------------------------------------------------------------------- diff --git a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java index 798b097..0fd3e44 100644 --- a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java +++ b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java @@ -71,7 +71,7 @@ public class MessageMetaDataBinding implements EntryBinding<StorableMessageMetaD } return metaData; } - catch (IOException e) + catch (IOException | RuntimeException e) { throw new StoreException(String.format("Unable to convert entry %s to metadata", entry)); } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-core/src/main/java/org/apache/qpid/server/bytebuffer/QpidByteBufferUtils.java ---------------------------------------------------------------------- diff --git a/broker-core/src/main/java/org/apache/qpid/server/bytebuffer/QpidByteBufferUtils.java b/broker-core/src/main/java/org/apache/qpid/server/bytebuffer/QpidByteBufferUtils.java index 57552a8..2592559 100644 --- a/broker-core/src/main/java/org/apache/qpid/server/bytebuffer/QpidByteBufferUtils.java +++ b/broker-core/src/main/java/org/apache/qpid/server/bytebuffer/QpidByteBufferUtils.java @@ -267,5 +267,10 @@ public class QpidByteBufferUtils } i++; } + + if (skipped != length) + { + throw new BufferUnderflowException(); + } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-core/src/main/java/org/apache/qpid/server/store/serializer/v1/MessageStoreSerializer_v1.java ---------------------------------------------------------------------- diff --git a/broker-core/src/main/java/org/apache/qpid/server/store/serializer/v1/MessageStoreSerializer_v1.java b/broker-core/src/main/java/org/apache/qpid/server/store/serializer/v1/MessageStoreSerializer_v1.java index 9f0098a..c75b930 100644 --- a/broker-core/src/main/java/org/apache/qpid/server/store/serializer/v1/MessageStoreSerializer_v1.java +++ b/broker-core/src/main/java/org/apache/qpid/server/store/serializer/v1/MessageStoreSerializer_v1.java @@ -46,6 +46,7 @@ import org.apache.qpid.server.store.handler.DistributedTransactionHandler; import org.apache.qpid.server.store.handler.MessageHandler; import org.apache.qpid.server.store.handler.MessageInstanceHandler; import org.apache.qpid.server.store.serializer.MessageStoreSerializer; +import org.apache.qpid.server.util.ConnectionScopedRuntimeException; @PluggableService public class MessageStoreSerializer_v1 implements MessageStoreSerializer @@ -307,8 +308,15 @@ public class MessageStoreSerializer_v1 implements MessageStoreSerializer final MessageMetaDataType metaDataType = MessageMetaDataTypeRegistry.fromOrdinal(metaData[0] & 0xff); QpidByteBuffer buf = QpidByteBuffer.wrap(metaData, 1, metaData.length - 1); - final StorableMessageMetaData storableMessageMetaData = - metaDataType.createMetaData(Collections.singletonList(buf)); + final StorableMessageMetaData storableMessageMetaData; + try + { + storableMessageMetaData = metaDataType.createMetaData(Collections.singletonList(buf)); + } + catch (ConnectionScopedRuntimeException e) + { + throw new IllegalArgumentException("Could not deserialize message metadata", e); + } buf.dispose(); final MessageHandle<StorableMessageMetaData> handle = store.addMessage(storableMessageMetaData); http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageMetaData_1_0.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageMetaData_1_0.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageMetaData_1_0.java index 5b6d6b8..6d59a15 100755 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageMetaData_1_0.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageMetaData_1_0.java @@ -438,6 +438,10 @@ public class MessageMetaData_1_0 implements StorableMessageMetaData long contentSize = 0; if (versionByte == 1) { + if (!QpidByteBufferUtils.hasRemaining(bufs, 17)) + { + throw new ConnectionScopedRuntimeException("Cannot decode stored message meta data."); + } // we can discard the first byte QpidByteBufferUtils.get(bufs); arrivalTime = QpidByteBufferUtils.getLong(bufs); @@ -479,7 +483,6 @@ public class MessageMetaData_1_0 implements StorableMessageMetaData } catch (AmqpErrorException e) { - //TODO throw new ConnectionScopedRuntimeException(e); } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/AbstractCompositeTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/AbstractCompositeTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/AbstractCompositeTypeConstructor.java index c417b69..00a1252 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/AbstractCompositeTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/AbstractCompositeTypeConstructor.java @@ -62,13 +62,13 @@ public abstract class AbstractCompositeTypeConstructor<T> implements DescribedTy private T constructType() throws AmqpErrorException { + int size; final TypeConstructor typeConstructor = _valueHandler.readConstructor(_in); + long remaining = QpidByteBufferUtils.remaining(_in); if (typeConstructor instanceof ListConstructor) { ListConstructor listConstructor = (ListConstructor) typeConstructor; - int size; - long remaining = QpidByteBufferUtils.remaining(_in); - if (remaining < listConstructor.getSize()) + if (remaining < listConstructor.getSize() * 2) { throw new AmqpErrorException(AmqpError.DECODE_ERROR, String.format("Not sufficient data for deserialization of '%s'." @@ -102,6 +102,7 @@ public abstract class AbstractCompositeTypeConstructor<T> implements DescribedTy } else if (typeConstructor instanceof ZeroListConstructor) { + size = 0; _count = 0; } else @@ -110,7 +111,28 @@ public abstract class AbstractCompositeTypeConstructor<T> implements DescribedTy String.format("Unexpected format when deserializing of '%s'", getTypeName())); } - return AbstractCompositeTypeConstructor.this.construct(this); + + final T constructedObject = AbstractCompositeTypeConstructor.this.construct(this); + + long expectedRemaining = remaining - size; + long unconsumedBytes = QpidByteBufferUtils.remaining(_in) - expectedRemaining; + if(unconsumedBytes > 0) + { + final String msg = + String.format("%s incorrectly encoded, %d bytes remaining after decoding %d elements", + getTypeName(), unconsumedBytes, _count); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, msg); + } + else if (unconsumedBytes < 0) + { + final String msg = String.format( + "%s incorrectly encoded, %d bytes beyond provided size consumed after decoding %d elements", + getTypeName(), + -unconsumedBytes, + _count); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, msg); + } + return constructedObject; } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ArrayTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ArrayTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ArrayTypeConstructor.java index 0545f76..a25f506 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ArrayTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ArrayTypeConstructor.java @@ -51,19 +51,23 @@ public abstract class ArrayTypeConstructor implements TypeConstructor<Object[]> { rval.add(t.construct(in, handler)); } - long unconsumedBytes = remaining - (QpidByteBufferUtils.remaining(in) + (long) size); + long expectedRemaining = remaining - size; + long unconsumedBytes = QpidByteBufferUtils.remaining(in) - expectedRemaining; if(unconsumedBytes > 0) { - throw new AmqpErrorException(AmqpError.DECODE_ERROR, - "Array incorrectly encoded, %d bytes remaining after decoding %d elements", - unconsumedBytes, count); + final String msg = String.format("Array incorrectly encoded, %d bytes remaining after decoding %d elements", + unconsumedBytes, + count); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, msg); } else if (unconsumedBytes < 0) { - throw new AmqpErrorException(AmqpError.DECODE_ERROR, - "Array incorrectly encoded, %d bytes beyond provided size consumed after decoding %d elements", - -unconsumedBytes, count); + final String msg = String.format( + "Array incorrectly encoded, %d bytes beyond provided size consumed after decoding %d elements", + -unconsumedBytes, + count); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, msg); } if(rval.size() == 0) { http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/BinaryTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/BinaryTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/BinaryTypeConstructor.java index 486bea0..622e9ea 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/BinaryTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/BinaryTypeConstructor.java @@ -25,7 +25,7 @@ import java.util.List; import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; import org.apache.qpid.server.protocol.v1_0.type.Binary; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class BinaryTypeConstructor extends VariableWidthTypeConstructor { @@ -49,7 +49,12 @@ public class BinaryTypeConstructor extends VariableWidthTypeConstructor int size; - if(getSize() == 1) + if (!QpidByteBufferUtils.hasRemaining(in, getSize())) + { + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct binary: insufficient input data"); + } + + if (getSize() == 1) { size = QpidByteBufferUtils.get(in) & 0xFF; } @@ -58,16 +63,13 @@ public class BinaryTypeConstructor extends VariableWidthTypeConstructor size = QpidByteBufferUtils.getInt(in); } - if(!QpidByteBufferUtils.hasRemaining(in, size)) + if (!QpidByteBufferUtils.hasRemaining(in, size)) { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new org.apache.qpid.server.protocol.v1_0.type.transport.Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct binary: insufficient input data"); - throw new AmqpErrorException(error); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct binary: insufficient input data"); } byte[] data = new byte[size]; - QpidByteBufferUtils.get(in,data); + QpidByteBufferUtils.get(in, data); return new Binary(data); } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/BooleanConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/BooleanConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/BooleanConstructor.java index 1d7310d..08431cd 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/BooleanConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/BooleanConstructor.java @@ -62,10 +62,7 @@ public class BooleanConstructor } else { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct boolean: insufficient input data"); - throw new AmqpErrorException(error); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct boolean: insufficient input data"); } } }; http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ByteTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ByteTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ByteTypeConstructor.java index 2fa9e41..47213cd 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ByteTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ByteTypeConstructor.java @@ -22,11 +22,10 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; -import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; -import org.apache.qpid.server.protocol.v1_0.type.*; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; -import org.apache.qpid.server.protocol.v1_0.type.transport.Error; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; +import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class ByteTypeConstructor implements TypeConstructor<Byte> { @@ -50,11 +49,7 @@ public class ByteTypeConstructor implements TypeConstructor<Byte> } else { - Error error = new Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct byte: insufficient input data"); - throw new AmqpErrorException(error); - + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct byte: insufficient input data"); } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/CharTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/CharTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/CharTypeConstructor.java index 6cce923..5f7a1ab 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/CharTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/CharTypeConstructor.java @@ -52,11 +52,7 @@ public class CharTypeConstructor implements TypeConstructor<String> } else { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new org.apache.qpid.server.protocol.v1_0.type.transport.Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct char: insufficient input data"); - throw new AmqpErrorException(error); - + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct char: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/DecimalConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/DecimalConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/DecimalConstructor.java index d46f4aa..d7ae43f 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/DecimalConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/DecimalConstructor.java @@ -25,7 +25,7 @@ import java.util.List; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public abstract class DecimalConstructor implements TypeConstructor<BigDecimal> { @@ -44,7 +44,7 @@ public abstract class DecimalConstructor implements TypeConstructor<BigDecimal> } else { - throw new AmqpErrorException(ConnectionError.FRAMING_ERROR, "Cannot construct decimal32: insufficient input data"); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct decimal32: insufficient input data"); } return constructFrom32(val); @@ -67,7 +67,7 @@ public abstract class DecimalConstructor implements TypeConstructor<BigDecimal> } else { - throw new AmqpErrorException(ConnectionError.FRAMING_ERROR, "Cannot construct decimal64: insufficient input data"); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct decimal64: insufficient input data"); } return constructFrom64(val); @@ -93,7 +93,7 @@ public abstract class DecimalConstructor implements TypeConstructor<BigDecimal> } else { - throw new AmqpErrorException(ConnectionError.FRAMING_ERROR, "Cannot construct decimal128: insufficient input data"); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct decimal128: insufficient input data"); } return constructFrom128(high, low); http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/DoubleTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/DoubleTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/DoubleTypeConstructor.java index aba2d8c..aaaef75 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/DoubleTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/DoubleTypeConstructor.java @@ -22,11 +22,10 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; +import org.apache.qpid.server.bytebuffer.QpidByteBuffer; import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; -import org.apache.qpid.server.protocol.v1_0.type.transport.Error; -import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class DoubleTypeConstructor implements TypeConstructor<Double> { @@ -51,10 +50,7 @@ public class DoubleTypeConstructor implements TypeConstructor<Double> } else { - Error error = new Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct double: insufficient input data"); - throw new AmqpErrorException(error); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct double: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/FloatTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/FloatTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/FloatTypeConstructor.java index 66be0d3..9c8c88e 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/FloatTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/FloatTypeConstructor.java @@ -22,11 +22,10 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; -import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; -import org.apache.qpid.server.protocol.v1_0.type.*; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; -import org.apache.qpid.server.protocol.v1_0.type.transport.Error; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; +import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class FloatTypeConstructor implements TypeConstructor<Float> { @@ -51,10 +50,7 @@ public class FloatTypeConstructor implements TypeConstructor<Float> } else { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct float: insufficient input data"); - throw new AmqpErrorException(error); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct float: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/IntTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/IntTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/IntTypeConstructor.java index 69f3a25..8428e00 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/IntTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/IntTypeConstructor.java @@ -22,10 +22,10 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; -import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; -import org.apache.qpid.server.protocol.v1_0.type.*; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; +import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class IntTypeConstructor implements TypeConstructor<Integer> { @@ -50,11 +50,7 @@ public class IntTypeConstructor implements TypeConstructor<Integer> } else { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new org.apache.qpid.server.protocol.v1_0.type.transport.Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct int: insufficient input data"); - throw new AmqpErrorException(error); - + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct int: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ListConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ListConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ListConstructor.java index 87011d2..9c9f169 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ListConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ListConstructor.java @@ -41,7 +41,7 @@ public class ListConstructor extends VariableWidthTypeConstructor<List> int size; int count; long remaining = QpidByteBufferUtils.remaining(in); - if (remaining < getSize()) + if (remaining < getSize() * 2) { throw new AmqpErrorException(AmqpError.DECODE_ERROR, String.format("Not sufficient data for deserialization of 'list'." http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/LongTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/LongTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/LongTypeConstructor.java index 2b44607..70c8400 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/LongTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/LongTypeConstructor.java @@ -22,10 +22,10 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; -import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; -import org.apache.qpid.server.protocol.v1_0.type.*; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; +import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class LongTypeConstructor implements TypeConstructor<Long> { @@ -50,11 +50,7 @@ public class LongTypeConstructor implements TypeConstructor<Long> } else { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new org.apache.qpid.server.protocol.v1_0.type.transport.Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct long: insufficient input data"); - throw new AmqpErrorException(error); - + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct long: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/MapConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/MapConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/MapConstructor.java index 4c791e8..e04480a 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/MapConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/MapConstructor.java @@ -42,15 +42,16 @@ public class MapConstructor extends VariableWidthTypeConstructor<Map> return construct(in, handler, Object.class, Object.class); } - public <T,S> Map<T, S> construct(final List<QpidByteBuffer> in, final ValueHandler handler, - Class<T> keyType, - Class<S> valueType) throws AmqpErrorException + public <T, S> Map<T, S> construct(final List<QpidByteBuffer> in, + final ValueHandler handler, + Class<T> keyType, + Class<S> valueType) throws AmqpErrorException { int size; int count; long remaining = QpidByteBufferUtils.remaining(in); - if (remaining < getSize()) + if (remaining < getSize() * 2) { throw new AmqpErrorException(AmqpError.DECODE_ERROR, String.format("Not sufficient data for deserialization of 'map'." @@ -59,7 +60,7 @@ public class MapConstructor extends VariableWidthTypeConstructor<Map> remaining)); } - if(getSize() == 1) + if (getSize() == 1) { size = QpidByteBufferUtils.get(in) & 0xFF; count = QpidByteBufferUtils.get(in) & 0xFF; @@ -83,12 +84,12 @@ public class MapConstructor extends VariableWidthTypeConstructor<Map> } - private <T, S> Map<T,S> construct(final List<QpidByteBuffer> in, - final ValueHandler handler, - final int size, - final int count, - Class<T> keyType, - Class<S> valueType) + private <T, S> Map<T, S> construct(final List<QpidByteBuffer> in, + final ValueHandler handler, + final int size, + final int count, + Class<T> keyType, + Class<S> valueType) throws AmqpErrorException { @@ -102,7 +103,7 @@ public class MapConstructor extends VariableWidthTypeConstructor<Map> Map<T, S> map = new LinkedHashMap<>(count); final int mapSize = count / 2; - for(int i = 0; i < mapSize; i++) + for (int i = 0; i < mapSize; i++) { Object key = handler.parse(in); if (key != null && !keyType.isAssignableFrom(key.getClass())) @@ -123,7 +124,7 @@ public class MapConstructor extends VariableWidthTypeConstructor<Map> } Object oldValue; - if ((oldValue = map.put((T)key, (S)value)) != null) + if ((oldValue = map.put((T) key, (S) value)) != null) { String message = String.format("Map cannot have duplicate keys: %s has values (%s, %s)", key, @@ -131,7 +132,6 @@ public class MapConstructor extends VariableWidthTypeConstructor<Map> value); throw new AmqpErrorException(AmqpError.DECODE_ERROR, message); } - } return map; } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/NullTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/NullTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/NullTypeConstructor.java index 6b49222..b0620ca 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/NullTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/NullTypeConstructor.java @@ -33,7 +33,7 @@ class NullTypeConstructor implements TypeConstructor<Void> } @Override - public Void construct(final List<QpidByteBuffer> in, final ValueHandler handler) throws AmqpErrorException + public Void construct(final List<QpidByteBuffer> in, final ValueHandler handler) { return null; } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ShortTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ShortTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ShortTypeConstructor.java index 396911a..30e7efb 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ShortTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ShortTypeConstructor.java @@ -22,10 +22,10 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; -import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; -import org.apache.qpid.server.protocol.v1_0.type.*; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; +import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class ShortTypeConstructor implements TypeConstructor<Short> { @@ -50,11 +50,7 @@ public class ShortTypeConstructor implements TypeConstructor<Short> } else { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new org.apache.qpid.server.protocol.v1_0.type.transport.Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct short: insufficient input data"); - throw new AmqpErrorException(error); - + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct short: insufficient input data"); } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallIntConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallIntConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallIntConstructor.java index 5098b34..41f462e 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallIntConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallIntConstructor.java @@ -21,11 +21,10 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; +import org.apache.qpid.server.bytebuffer.QpidByteBuffer; import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; -import org.apache.qpid.server.protocol.v1_0.type.transport.Error; -import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class SmallIntConstructor implements TypeConstructor<Integer> { @@ -44,17 +43,14 @@ public class SmallIntConstructor implements TypeConstructor<Integer> @Override public Integer construct(final List<QpidByteBuffer> in, final ValueHandler handler) throws AmqpErrorException { - if(QpidByteBufferUtils.hasRemaining(in)) + if (QpidByteBufferUtils.hasRemaining(in)) { byte b = QpidByteBufferUtils.get(in); return (int) b; } else { - Error error = new Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct int: insufficient input data"); - throw new AmqpErrorException(error); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct int: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallLongConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallLongConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallLongConstructor.java index 0bf79d7..44741e1 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallLongConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallLongConstructor.java @@ -21,11 +21,10 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; +import org.apache.qpid.server.bytebuffer.QpidByteBuffer; import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; -import org.apache.qpid.server.protocol.v1_0.type.transport.Error; -import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class SmallLongConstructor implements TypeConstructor<Long> { @@ -44,17 +43,14 @@ public class SmallLongConstructor implements TypeConstructor<Long> @Override public Long construct(final List<QpidByteBuffer> in, final ValueHandler handler) throws AmqpErrorException { - if(QpidByteBufferUtils.hasRemaining(in)) + if (QpidByteBufferUtils.hasRemaining(in)) { byte b = QpidByteBufferUtils.get(in); return (long) b; } else { - Error error = new Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct long: insufficient input data"); - throw new AmqpErrorException(error); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct long: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallUIntConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallUIntConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallUIntConstructor.java index 32df052..b080814 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallUIntConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallUIntConstructor.java @@ -20,12 +20,11 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; +import org.apache.qpid.server.bytebuffer.QpidByteBuffer; import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; import org.apache.qpid.server.protocol.v1_0.type.UnsignedInteger; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; -import org.apache.qpid.server.protocol.v1_0.type.transport.Error; -import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class SmallUIntConstructor implements TypeConstructor<UnsignedInteger> { @@ -45,17 +44,14 @@ public class SmallUIntConstructor implements TypeConstructor<UnsignedInteger> public UnsignedInteger construct(final List<QpidByteBuffer> in, final ValueHandler handler) throws AmqpErrorException { - if(QpidByteBufferUtils.hasRemaining(in)) + if (QpidByteBufferUtils.hasRemaining(in)) { byte b = QpidByteBufferUtils.get(in); return UnsignedInteger.valueOf(((int) b) & 0xff); } else { - Error error = new Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct uint: insufficient input data"); - throw new AmqpErrorException(error); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct uint: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallULongConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallULongConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallULongConstructor.java index 845f745..9e34ea9 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallULongConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SmallULongConstructor.java @@ -21,12 +21,11 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; +import org.apache.qpid.server.bytebuffer.QpidByteBuffer; import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; import org.apache.qpid.server.protocol.v1_0.type.UnsignedLong; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; -import org.apache.qpid.server.protocol.v1_0.type.transport.Error; -import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class SmallULongConstructor implements TypeConstructor<UnsignedLong> { @@ -45,17 +44,14 @@ public class SmallULongConstructor implements TypeConstructor<UnsignedLong> @Override public UnsignedLong construct(final List<QpidByteBuffer> in, final ValueHandler handler) throws AmqpErrorException { - if(QpidByteBufferUtils.hasRemaining(in)) + if (QpidByteBufferUtils.hasRemaining(in)) { byte b = QpidByteBufferUtils.get(in); return UnsignedLong.valueOf(((long) b) & 0xffL); } else { - Error error = new Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct ulong: insufficient input data"); - throw new AmqpErrorException(error); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct ulong: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/StringTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/StringTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/StringTypeConstructor.java index 3a93f29..b1e5b42 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/StringTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/StringTypeConstructor.java @@ -28,7 +28,7 @@ import java.util.List; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class StringTypeConstructor extends VariableWidthTypeConstructor<String> { @@ -52,7 +52,7 @@ public class StringTypeConstructor extends VariableWidthTypeConstructor<String> QpidByteBuffer dup = in.duplicate(); try { - dup.limit(dup.position()+size); + dup.limit(dup.position() + size); CharBuffer charBuf = dup.decode(UTF_8); String str = charBuf.toString(); @@ -61,9 +61,14 @@ public class StringTypeConstructor extends VariableWidthTypeConstructor<String> return str; } - catch(IllegalArgumentException e) + catch (IllegalArgumentException e) { - throw new IllegalArgumentException("position: " + dup.position() + "size: " + size + " capacity: " + dup.capacity()); + throw new IllegalArgumentException("position: " + + dup.position() + + "size: " + + size + + " capacity: " + + dup.capacity()); } finally { @@ -76,7 +81,12 @@ public class StringTypeConstructor extends VariableWidthTypeConstructor<String> { int size; - if(getSize() == 1) + if (!QpidByteBufferUtils.hasRemaining(in, getSize())) + { + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct string: insufficient input data"); + } + + if (getSize() == 1) { size = QpidByteBufferUtils.get(in) & 0xFF; } @@ -85,20 +95,17 @@ public class StringTypeConstructor extends VariableWidthTypeConstructor<String> size = QpidByteBufferUtils.getInt(in); } - if(!QpidByteBufferUtils.hasRemaining(in, size)) + if (!QpidByteBufferUtils.hasRemaining(in, size)) { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new org.apache.qpid.server.protocol.v1_0.type.transport.Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct string: insufficient input data"); - throw new AmqpErrorException(error); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct string: insufficient input data"); } - for(int i = 0; i<in.size(); i++) + for (int i = 0; i < in.size(); i++) { QpidByteBuffer buf = in.get(i); - if(buf.hasRemaining()) + if (buf.hasRemaining()) { - if(buf.remaining() >= size) + if (buf.remaining() >= size) { return constructFromSingleBuffer(buf, size); } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SymbolTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SymbolTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SymbolTypeConstructor.java index c58a52f..09f467f 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SymbolTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/SymbolTypeConstructor.java @@ -26,11 +26,11 @@ import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import org.apache.qpid.server.bytebuffer.QpidByteBuffer; import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; import org.apache.qpid.server.protocol.v1_0.type.Symbol; -import org.apache.qpid.server.bytebuffer.QpidByteBuffer; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class SymbolTypeConstructor extends VariableWidthTypeConstructor<Symbol> { @@ -55,7 +55,7 @@ public class SymbolTypeConstructor extends VariableWidthTypeConstructor<Symbol> BinaryString binaryStr; if (in.hasArray()) { - binaryStr = new BinaryString(in.array(), in.arrayOffset()+in.position(), size); + binaryStr = new BinaryString(in.array(), in.arrayOffset() + in.position(), size); } else { @@ -67,10 +67,10 @@ public class SymbolTypeConstructor extends VariableWidthTypeConstructor<Symbol> } Symbol symbolVal = SYMBOL_MAP.get(binaryStr); - if(symbolVal == null) + if (symbolVal == null) { QpidByteBuffer dup = in.duplicate(); - dup.limit(in.position()+size); + dup.limit(in.position() + size); CharBuffer charBuf = dup.decode(ASCII); dup.dispose(); @@ -83,7 +83,7 @@ public class SymbolTypeConstructor extends VariableWidthTypeConstructor<Symbol> } else { - in.position(in.position()+size); + in.position(in.position() + size); } return symbolVal; @@ -95,7 +95,12 @@ public class SymbolTypeConstructor extends VariableWidthTypeConstructor<Symbol> int size; - if(getSize() == 1) + if (!QpidByteBufferUtils.hasRemaining(in, getSize())) + { + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct symbol: insufficient input data"); + } + + if (getSize() == 1) { size = QpidByteBufferUtils.get(in) & 0xFF; } @@ -104,20 +109,17 @@ public class SymbolTypeConstructor extends VariableWidthTypeConstructor<Symbol> size = QpidByteBufferUtils.getInt(in); } - if(!QpidByteBufferUtils.hasRemaining(in, size)) + if (!QpidByteBufferUtils.hasRemaining(in, size)) { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new org.apache.qpid.server.protocol.v1_0.type.transport.Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct symbol: insufficient input data"); - throw new AmqpErrorException(error); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct symbol: insufficient input data"); } - for(int i = 0; i<in.size(); i++) + for (int i = 0; i < in.size(); i++) { QpidByteBuffer buf = in.get(i); - if(buf.hasRemaining()) + if (buf.hasRemaining()) { - if(buf.remaining() >= size) + if (buf.remaining() >= size) { return constructFromSingleBuffer(buf, size); } @@ -130,7 +132,7 @@ public class SymbolTypeConstructor extends VariableWidthTypeConstructor<Symbol> final BinaryString binaryStr = new BinaryString(data); Symbol symbolVal = SYMBOL_MAP.get(binaryStr); - if(symbolVal == null) + if (symbolVal == null) { symbolVal = Symbol.valueOf(new String(data, ASCII)); SYMBOL_MAP.putIfAbsent(binaryStr, symbolVal); http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/TimestampTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/TimestampTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/TimestampTypeConstructor.java index a76ae6f..eae7282 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/TimestampTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/TimestampTypeConstructor.java @@ -26,7 +26,7 @@ import java.util.List; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class TimestampTypeConstructor implements TypeConstructor<Date> { @@ -52,11 +52,7 @@ public class TimestampTypeConstructor implements TypeConstructor<Date> } else { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new org.apache.qpid.server.protocol.v1_0.type.transport.Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct timestamp: insufficient input data"); - throw new AmqpErrorException(error); - + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct timestamp: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UByteTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UByteTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UByteTypeConstructor.java index d03668c..e9a2bc5 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UByteTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UByteTypeConstructor.java @@ -22,11 +22,11 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; -import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; -import org.apache.qpid.server.protocol.v1_0.type.*; -import org.apache.qpid.server.protocol.v1_0.type.transport.Error; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; +import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; +import org.apache.qpid.server.protocol.v1_0.type.UnsignedByte; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class UByteTypeConstructor implements TypeConstructor<UnsignedByte> { @@ -52,10 +52,7 @@ public class UByteTypeConstructor implements TypeConstructor<UnsignedByte> } else { - Error error = new Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct ubyte: insufficient input data"); - throw new AmqpErrorException(error); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct ubyte: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UIntTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UIntTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UIntTypeConstructor.java index 700817d..f8d4c21 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UIntTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UIntTypeConstructor.java @@ -22,10 +22,11 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; -import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; -import org.apache.qpid.server.protocol.v1_0.type.*; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; +import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; +import org.apache.qpid.server.protocol.v1_0.type.UnsignedInteger; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class UIntTypeConstructor implements TypeConstructor<UnsignedInteger> { @@ -52,11 +53,7 @@ public class UIntTypeConstructor implements TypeConstructor<UnsignedInteger> } else { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new org.apache.qpid.server.protocol.v1_0.type.transport.Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct uint: insufficient input data"); - throw new AmqpErrorException(error); - + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct uint: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ULongTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ULongTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ULongTypeConstructor.java index dbd606f..5a71935 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ULongTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ULongTypeConstructor.java @@ -22,10 +22,11 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; -import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; -import org.apache.qpid.server.protocol.v1_0.type.*; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; +import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; +import org.apache.qpid.server.protocol.v1_0.type.UnsignedLong; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class ULongTypeConstructor implements TypeConstructor<UnsignedLong> { @@ -53,11 +54,7 @@ public class ULongTypeConstructor implements TypeConstructor<UnsignedLong> } else { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new org.apache.qpid.server.protocol.v1_0.type.transport.Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct ulong: insufficient input data"); - throw new AmqpErrorException(error); - + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct ulong: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UShortTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UShortTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UShortTypeConstructor.java index b22790b..8174d5b 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UShortTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UShortTypeConstructor.java @@ -22,11 +22,11 @@ package org.apache.qpid.server.protocol.v1_0.codec; import java.util.List; -import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; -import org.apache.qpid.server.protocol.v1_0.type.*; -import org.apache.qpid.server.protocol.v1_0.type.transport.Error; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; +import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; +import org.apache.qpid.server.protocol.v1_0.type.UnsignedShort; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class UShortTypeConstructor implements TypeConstructor<UnsignedShort> { @@ -52,11 +52,7 @@ public class UShortTypeConstructor implements TypeConstructor<UnsignedShort> } else { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct ushort: insufficient input data"); - throw new AmqpErrorException(error); - + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct ushort: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UUIDTypeConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UUIDTypeConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UUIDTypeConstructor.java index 4bff5c0..ce247fd 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UUIDTypeConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/UUIDTypeConstructor.java @@ -26,8 +26,7 @@ import java.util.UUID; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; -import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; -import org.apache.qpid.server.protocol.v1_0.type.transport.Error; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; public class UUIDTypeConstructor implements TypeConstructor<UUID> { @@ -54,11 +53,7 @@ public class UUIDTypeConstructor implements TypeConstructor<UUID> } else { - org.apache.qpid.server.protocol.v1_0.type.transport.Error error = new Error(); - error.setCondition(ConnectionError.FRAMING_ERROR); - error.setDescription("Cannot construct UUID: insufficient input data"); - throw new AmqpErrorException(error); - + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Cannot construct UUID: insufficient input data"); } } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ValueHandler.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ValueHandler.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ValueHandler.java index 56347f6..b7959e1 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ValueHandler.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ValueHandler.java @@ -32,7 +32,7 @@ import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; public class ValueHandler implements DescribedTypeConstructorRegistry.Source { - private static final byte DESCRIBED_TYPE = (byte)0; + public static final byte DESCRIBED_TYPE = (byte)0; private final DescribedTypeConstructorRegistry _describedTypeConstructorRegistry; @@ -91,6 +91,7 @@ public class ValueHandler implements DescribedTypeConstructorRegistry.Source { return parse(new ArrayList<>(Arrays.asList(in))); } + public Object parse(final List<QpidByteBuffer> in) throws AmqpErrorException { TypeConstructor constructor = readConstructor(in); http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroListConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroListConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroListConstructor.java index ae62241..4916538 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroListConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroListConstructor.java @@ -34,7 +34,7 @@ class ZeroListConstructor implements TypeConstructor<List> } @Override - public List construct(final List<QpidByteBuffer> in, final ValueHandler handler) throws AmqpErrorException + public List construct(final List<QpidByteBuffer> in, final ValueHandler handler) { return Collections.EMPTY_LIST; } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroUIntConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroUIntConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroUIntConstructor.java index 054ce8d..b83bf12 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroUIntConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroUIntConstructor.java @@ -35,7 +35,6 @@ class ZeroUIntConstructor implements TypeConstructor<UnsignedInteger> @Override public UnsignedInteger construct(final List<QpidByteBuffer> in, final ValueHandler handler) - throws AmqpErrorException { return UnsignedInteger.ZERO; } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroULongConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroULongConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroULongConstructor.java index 521da99..cdd086c 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroULongConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/codec/ZeroULongConstructor.java @@ -34,7 +34,7 @@ class ZeroULongConstructor implements TypeConstructor<UnsignedLong> } @Override - public UnsignedLong construct(final List<QpidByteBuffer> in, final ValueHandler handler) throws AmqpErrorException + public UnsignedLong construct(final List<QpidByteBuffer> in, final ValueHandler handler) { return UnsignedLong.ZERO; } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/framing/FrameHandler.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/framing/FrameHandler.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/framing/FrameHandler.java index baebf51..523aec1 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/framing/FrameHandler.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/framing/FrameHandler.java @@ -34,6 +34,7 @@ import org.apache.qpid.server.protocol.v1_0.codec.ProtocolHandler; import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; import org.apache.qpid.server.protocol.v1_0.type.ErrorCondition; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; import org.apache.qpid.server.protocol.v1_0.type.transport.ChannelFrameBody; import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; import org.apache.qpid.server.protocol.v1_0.type.transport.Error; @@ -213,7 +214,7 @@ public class FrameHandler implements ProtocolHandler } LOGGER.warn("Unexpected exception handling frame", e); // This exception is unexpected. The up layer should handle error condition gracefully - _connectionHandler.handleError(this.createError(ConnectionError.CONNECTION_FORCED, e.toString())); + _connectionHandler.handleError(this.createError(AmqpError.INTERNAL_ERROR, e.toString())); } return this; } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/messaging/SectionDecoder.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/messaging/SectionDecoder.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/messaging/SectionDecoder.java index d50162d..34d97e4 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/messaging/SectionDecoder.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/messaging/SectionDecoder.java @@ -28,8 +28,5 @@ import org.apache.qpid.server.protocol.v1_0.type.messaging.EncodingRetainingSect public interface SectionDecoder { - List<EncodingRetainingSection<?>> parseAll(List<QpidByteBuffer> buf) throws AmqpErrorException; - - EncodingRetainingSection<?> readSection(List<QpidByteBuffer> buf) throws AmqpErrorException; } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/messaging/SectionDecoderImpl.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/messaging/SectionDecoderImpl.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/messaging/SectionDecoderImpl.java index 7b9f742..8c327eb 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/messaging/SectionDecoderImpl.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/messaging/SectionDecoderImpl.java @@ -65,12 +65,4 @@ public class SectionDecoderImpl implements SectionDecoder return obj; } - - - @Override - public EncodingRetainingSection<?> readSection(List<QpidByteBuffer> buf) throws AmqpErrorException - { - return (EncodingRetainingSection<?>) _valueHandler.parse(buf); - } - } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AbstractSection.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AbstractSection.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AbstractSection.java index ce284f1..c6a7be9 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AbstractSection.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AbstractSection.java @@ -32,6 +32,7 @@ import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder; import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoderImpl; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; import org.apache.qpid.server.protocol.v1_0.type.codec.AMQPDescribedTypeRegistry; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; import org.apache.qpid.server.util.ConnectionScopedRuntimeException; public abstract class AbstractSection<T, S extends NonEncodingRetainingSection<T>> implements EncodingRetainingSection<T> @@ -178,6 +179,12 @@ public abstract class AbstractSection<T, S extends NonEncodingRetainingSection<T originalPositions[i] = input.get(i).position(); } int describedByte = QpidByteBufferUtils.get(input); + if (describedByte != ValueHandler.DESCRIBED_TYPE) + { + throw new ConnectionScopedRuntimeException("Cannot decode section", + new AmqpErrorException(AmqpError.DECODE_ERROR, + "Not a described type.")); + } ValueHandler handler = new ValueHandler(TYPE_REGISTRY); try { http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2402b637/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java ---------------------------------------------------------------------- diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java index 274a2aa..1af86b8 100644 --- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java +++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java @@ -26,15 +26,16 @@ package org.apache.qpid.server.protocol.v1_0.type.messaging.codec; import java.util.List; import org.apache.qpid.server.bytebuffer.QpidByteBuffer; +import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructor; import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructorRegistry; -import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils; import org.apache.qpid.server.protocol.v1_0.codec.TypeConstructor; import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler; import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException; import org.apache.qpid.server.protocol.v1_0.type.Symbol; import org.apache.qpid.server.protocol.v1_0.type.UnsignedLong; import org.apache.qpid.server.protocol.v1_0.type.messaging.AmqpValueSection; +import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError; import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError; public class AmqpValueSectionConstructor implements DescribedTypeConstructor<AmqpValueSection> @@ -83,9 +84,13 @@ public class AmqpValueSectionConstructor implements DescribedTypeConstructor<Amq @Override protected void skipValue(final List<QpidByteBuffer> in) throws AmqpErrorException { + if (!QpidByteBufferUtils.hasRemaining(in)) + { + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Insufficient data to decode AMQP value section."); + } byte formatCode = QpidByteBufferUtils.get(in); - if (formatCode == 0) + if (formatCode == ValueHandler.DESCRIBED_TYPE) { // This is only valid if the described value is not an array skipValue(in); @@ -93,39 +98,57 @@ public class AmqpValueSectionConstructor implements DescribedTypeConstructor<Amq } else { + final int skipLength; int category = (formatCode >> 4) & 0x0F; switch (category) { case 0x04: + skipLength = 0; break; case 0x05: - QpidByteBufferUtils.skip(in, 1); + skipLength = 1; break; case 0x06: - QpidByteBufferUtils.skip(in, 2); + skipLength = 2; break; case 0x07: - QpidByteBufferUtils.skip(in, 4); + skipLength = 4; break; case 0x08: - QpidByteBufferUtils.skip(in, 8); + skipLength = 8; break; case 0x09: - QpidByteBufferUtils.skip(in, 16); + skipLength = 16; break; case 0x0a: case 0x0c: case 0x0e: - QpidByteBufferUtils.skip(in, ((int) QpidByteBufferUtils.get(in)) & 0xFF); + if (!QpidByteBufferUtils.hasRemaining(in)) + { + throw new AmqpErrorException(AmqpError.DECODE_ERROR, + "Insufficient data to decode AMQP value section."); + } + skipLength = ((int) QpidByteBufferUtils.get(in)) & 0xFF; break; case 0x0b: case 0x0d: case 0x0f: - QpidByteBufferUtils.skip(in, QpidByteBufferUtils.getInt(in)); + if (!QpidByteBufferUtils.hasRemaining(in, 4)) + { + throw new AmqpErrorException(AmqpError.DECODE_ERROR, + "Insufficient data to decode AMQP value section."); + } + skipLength = QpidByteBufferUtils.getInt(in); break; default: - throw new AmqpErrorException(ConnectionError.FRAMING_ERROR, "Unknown type"); + throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Unknown type"); + } + if (!QpidByteBufferUtils.hasRemaining(in, skipLength)) + { + throw new AmqpErrorException(AmqpError.DECODE_ERROR, + "Insufficient data to decode AMQP value section."); } + QpidByteBufferUtils.skip(in,skipLength); } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org