From 2eb56f820d6845bc96342191d9e90dd50dc76b0d Mon Sep 17 00:00:00 2001 From: Robert Gemmell Date: Tue, 7 Jun 2011 15:04:42 +0000 Subject: QPID-2158: add length validation into AMQShortString, remove dead code from AMQDestinations, truncate exception messages with length over 255 before sending them over the wire in AMQChannelException and AMQConnectionException. Applied patch by Oleksandr Rudyy git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1133037 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/qpid/AMQChannelException.java | 3 +- .../org/apache/qpid/AMQConnectionException.java | 3 +- .../main/java/org/apache/qpid/AMQException.java | 16 +++++ .../org/apache/qpid/framing/AMQShortString.java | 83 ++++++++++++---------- 4 files changed, 67 insertions(+), 38 deletions(-) (limited to 'qpid/java/common/src/main') diff --git a/qpid/java/common/src/main/java/org/apache/qpid/AMQChannelException.java b/qpid/java/common/src/main/java/org/apache/qpid/AMQChannelException.java index ef9420ba87..2f6290b55a 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/AMQChannelException.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/AMQChannelException.java @@ -54,6 +54,7 @@ public class AMQChannelException extends AMQException public AMQFrame getCloseFrame(int channel) { MethodRegistry reg = MethodRegistry.getMethodRegistry(new ProtocolVersion(major,minor)); - return new AMQFrame(channel, reg.createChannelCloseBody(getErrorCode() == null ? AMQConstant.INTERNAL_ERROR.getCode() : getErrorCode().getCode(), new AMQShortString(getMessage()),_classId,_methodId)); + return new AMQFrame(channel, reg.createChannelCloseBody(getErrorCode() == null ? AMQConstant.INTERNAL_ERROR.getCode() : getErrorCode().getCode(), getMessageAsShortString(),_classId,_methodId)); } + } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/AMQConnectionException.java b/qpid/java/common/src/main/java/org/apache/qpid/AMQConnectionException.java index 8ef6facef1..ca9c9f9dc4 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/AMQConnectionException.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/AMQConnectionException.java @@ -62,9 +62,10 @@ public class AMQConnectionException extends AMQException MethodRegistry reg = MethodRegistry.getMethodRegistry(new ProtocolVersion(major,minor)); return new AMQFrame(0, reg.createConnectionCloseBody(getErrorCode().getCode(), - new AMQShortString(getMessage()), + getMessageAsShortString(), _classId, _methodId)); } + } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/AMQException.java b/qpid/java/common/src/main/java/org/apache/qpid/AMQException.java index b0c6fccc9e..86d439d269 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/AMQException.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/AMQException.java @@ -20,6 +20,7 @@ */ package org.apache.qpid; +import org.apache.qpid.framing.AMQShortString; import org.apache.qpid.protocol.AMQConstant; /** @@ -121,4 +122,19 @@ public class AMQException extends Exception return newAMQE; } + + /** + * Truncates the exception message to 255 characters if its length exceeds 255. + * + * @return exception message + */ + public AMQShortString getMessageAsShortString() + { + String message = getMessage(); + if (message != null && message.length() > AMQShortString.MAX_LENGTH) + { + message = message.substring(0, AMQShortString.MAX_LENGTH - 3) + "..."; + } + return new AMQShortString(message); + } } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java index 39a9beb9e8..2b9e2ffaba 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java @@ -37,6 +37,10 @@ import java.lang.ref.WeakReference; */ public final class AMQShortString implements CharSequence, Comparable { + /** + * The maximum number of octets in AMQ short string as defined in AMQP specification + */ + public static final int MAX_LENGTH = 255; private static final byte MINUS = (byte)'-'; private static final byte ZERO = (byte) '0'; @@ -118,22 +122,19 @@ public final class AMQShortString implements CharSequence, Comparable MAX_LENGTH) + { + throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!"); + } _data = data.clone(); _length = data.length; _offset = 0; } - public AMQShortString(byte[] data, int pos) - { - final int size = data[pos++]; - final byte[] dataCopy = new byte[size]; - System.arraycopy(data,pos,dataCopy,0,size); - _length = size; - _data = dataCopy; - _offset = 0; - } - public AMQShortString(String data) { this((data == null) ? EMPTY_CHAR_ARRAY : data.toCharArray()); @@ -146,7 +147,12 @@ public final class AMQShortString implements CharSequence, Comparable MAX_LENGTH) + { + throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!"); + } final int length = data.length; final byte[] stringBytes = new byte[length]; int hash = 0; @@ -165,6 +171,17 @@ public final class AMQShortString implements CharSequence, Comparable MAX_LENGTH) + { + throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!"); + } final int length = charSequence.length(); final byte[] stringBytes = new byte[length]; int hash = 0; @@ -184,6 +201,10 @@ public final class AMQShortString implements CharSequence, Comparable MAX_LENGTH) + { + throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!"); + } if(data.isDirect() || data.isReadOnly()) { byte[] dataBytes = new byte[length]; @@ -205,8 +226,17 @@ public final class AMQShortString implements CharSequence, Comparable MAX_LENGTH) + { + throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!"); + } _offset = from; - _length = to - from; + _length = length; _data = data; } @@ -245,29 +275,6 @@ public final class AMQShortString implements CharSequence, Comparable MAX_LENGTH) + { + throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!"); + } byte[] data = new byte[size]; int pos = 0; final byte[] delimData = delim._data; -- cgit v1.2.1