You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by lq...@apache.org on 2017/04/14 14:27:07 UTC

svn commit: r1791373 - in /qpid/java/trunk: broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/framing/ systests/protocol-tests-amqp-1...

Author: lquack
Date: Fri Apr 14 14:27:07 2017
New Revision: 1791373

URL: http://svn.apache.org/viewvc?rev=1791373&view=rev
Log:
QPID-7746: [Java Broker] Enforce AMQP 1.0 channel-max correctly

Modified:
    qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/AMQPConnection_1_0Impl.java
    qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConnectionHandler.java
    qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/framing/FrameHandler.java
    qpid/java/trunk/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/InputHandler.java
    qpid/java/trunk/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/connection/OpenTest.java

Modified: qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/AMQPConnection_1_0Impl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/AMQPConnection_1_0Impl.java?rev=1791373&r1=1791372&r2=1791373&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/AMQPConnection_1_0Impl.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/AMQPConnection_1_0Impl.java Fri Apr 14 14:27:07 2017
@@ -186,7 +186,7 @@ public class AMQPConnection_1_0Impl exte
     private AmqpPort<?> _port;
     private SubjectCreator _subjectCreator;
 
-    private int _channelMax = DEFAULT_CHANNEL_MAX;
+    private int _channelMax = 0;
     private int _maxFrameSize = 4096;
     private String _remoteContainerId;
 
@@ -288,6 +288,7 @@ public class AMQPConnection_1_0Impl exte
         return _desiredIdleTimeout;
     }
 
+    @Override
     public void receiveAttach(final short channel, final Attach attach)
     {
         assertState(FrameReceivingState.ANY_FRAME);
@@ -310,6 +311,7 @@ public class AMQPConnection_1_0Impl exte
         }
     }
 
+    @Override
     public void receive(final short channel, final Object frame)
     {
         FRAME_LOGGER.debug("RECV[{}|{}] : {}", _remoteAddress, channel, frame);
@@ -338,6 +340,7 @@ public class AMQPConnection_1_0Impl exte
         _saslNegotiator = null;
     }
 
+    @Override
     public void receiveSaslChallenge(final SaslChallenge saslChallenge)
     {
         LOGGER.info("{} : Unexpected frame sasl-challenge", getLogSubject());
@@ -719,10 +722,10 @@ public class AMQPConnection_1_0Impl exte
     {
         assertState(FrameReceivingState.OPEN_ONLY);
         _frameReceivingState = FrameReceivingState.ANY_FRAME;
-        _channelMax = open.getChannelMax() == null ? _channelMax
-                : open.getChannelMax().intValue() < _channelMax
+        _channelMax = open.getChannelMax() == null ? DEFAULT_CHANNEL_MAX
+                : open.getChannelMax().intValue() < DEFAULT_CHANNEL_MAX
                         ? open.getChannelMax().intValue()
-                        : _channelMax;
+                        : DEFAULT_CHANNEL_MAX;
         if (_receivingSessions == null)
         {
             _receivingSessions = new Session_1_0[_channelMax + 1];
@@ -1019,12 +1022,19 @@ public class AMQPConnection_1_0Impl exte
         closeSaslWithFailure();
     }
 
+    @Override
     public int getMaxFrameSize()
     {
         return _maxFrameSize;
     }
 
     @Override
+    public int getChannelMax()
+    {
+        return _channelMax;
+    }
+
+    @Override
     public Object getReference()
     {
         return _reference;

Modified: qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConnectionHandler.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConnectionHandler.java?rev=1791373&r1=1791372&r2=1791373&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConnectionHandler.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConnectionHandler.java Fri Apr 14 14:27:07 2017
@@ -53,6 +53,8 @@ public interface ConnectionHandler exten
 
     int getMaxFrameSize();
 
+    int getChannelMax();
+
     void handleError(Error parsingError);
 
     boolean closedForInput();

Modified: qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/framing/FrameHandler.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/framing/FrameHandler.java?rev=1791373&r1=1791372&r2=1791373&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/framing/FrameHandler.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/framing/FrameHandler.java Fri Apr 14 14:27:07 2017
@@ -135,6 +135,15 @@ public class FrameHandler implements Pro
 
                 int channel = ((int)in.getShort()) & 0xffff;
 
+                if (channel > _connectionHandler.getChannelMax())
+                {
+                    frameParsingError = createFramingError(
+                            "specified channel %d larger than maximum channel %d",
+                            channel,
+                            _connectionHandler.getChannelMax());
+                    break;
+                }
+
                 if (dataOffset != 8)
                 {
                     in.position(in.position() + dataOffset - 8);

Modified: qpid/java/trunk/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/InputHandler.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/InputHandler.java?rev=1791373&r1=1791372&r2=1791373&view=diff
==============================================================================
--- qpid/java/trunk/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/InputHandler.java (original)
+++ qpid/java/trunk/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/InputHandler.java Fri Apr 14 14:27:07 2017
@@ -34,6 +34,7 @@ import org.apache.qpid.server.protocol.v
 import org.apache.qpid.server.protocol.v1_0.framing.FrameHandler;
 import org.apache.qpid.server.protocol.v1_0.type.FrameBody;
 import org.apache.qpid.server.protocol.v1_0.type.SaslFrameBody;
+import org.apache.qpid.server.protocol.v1_0.type.UnsignedShort;
 import org.apache.qpid.server.protocol.v1_0.type.codec.AMQPDescribedTypeRegistry;
 import org.apache.qpid.server.protocol.v1_0.type.security.SaslChallenge;
 import org.apache.qpid.server.protocol.v1_0.type.security.SaslInit;
@@ -206,6 +207,12 @@ public class InputHandler extends Channe
         }
 
         @Override
+        public int getChannelMax()
+        {
+            return UnsignedShort.MAX_VALUE.intValue();
+        }
+
+        @Override
         public void handleError(final Error parsingError)
         {
 

Modified: qpid/java/trunk/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/connection/OpenTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/connection/OpenTest.java?rev=1791373&r1=1791372&r2=1791373&view=diff
==============================================================================
--- qpid/java/trunk/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/connection/OpenTest.java (original)
+++ qpid/java/trunk/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/connection/OpenTest.java Fri Apr 14 14:27:07 2017
@@ -37,6 +37,7 @@ import org.apache.qpid.server.protocol.v
 import org.apache.qpid.server.protocol.v1_0.type.UnsignedShort;
 import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError;
 import org.apache.qpid.server.protocol.v1_0.type.transport.Close;
+import org.apache.qpid.server.protocol.v1_0.type.transport.ConnectionError;
 import org.apache.qpid.server.protocol.v1_0.type.transport.Open;
 import org.apache.qpid.tests.protocol.v1_0.BrokerAdmin;
 import org.apache.qpid.tests.protocol.v1_0.FrameTransport;
@@ -96,7 +97,8 @@ public class OpenTest extends ProtocolTe
     }
 
     @Test
-    @SpecificationTest(section = "2.4.1", description = "The open frame can only be sent on channel 0")
+    @SpecificationTest(section = "2.4.1",
+            description = "The open frame can only be sent on channel 0. ยง2.7.1: A peer that receives a channel number outside the supported range MUST close the connection with the framing-error error-code.")
     public void failOpenOnChannelNotZero() throws Exception
     {
         final InetSocketAddress addr = getBrokerAdmin().getBrokerAddress(BrokerAdmin.PortType.ANONYMOUS_AMQP);
@@ -112,7 +114,7 @@ public class OpenTest extends ProtocolTe
             assertThat(response.getFrameBody(), is(instanceOf(Close.class)));
             Close responseClose = (Close) response.getFrameBody();
             assertThat(responseClose.getError(), is(notNullValue()));
-            assertThat(responseClose.getError().getCondition(), equalTo(AmqpError.NOT_ALLOWED));
+            assertThat(responseClose.getError().getCondition(), equalTo(ConnectionError.FRAMING_ERROR));
         }
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org