From 2e38fc2228a6a55e83cd365e1d6d2b19e70795c3 Mon Sep 17 00:00:00 2001 From: markt Date: Mon, 22 Aug 2011 17:55:14 +0000 Subject: [PATCH] Ensure AjpMessage header is correct for the direction in which the message is being sent git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1160347 13f79535-47bb-0310-9956-ffa450edef68 --- java/org/apache/coyote/ajp/AjpAprProcessor.java | 2 +- java/org/apache/coyote/ajp/AjpMessage.java | 9 +++++++-- java/org/apache/coyote/ajp/AjpNioProcessor.java | 2 +- java/org/apache/coyote/ajp/AjpProcessor.java | 2 +- test/org/apache/coyote/ajp/SimpleAjpClient.java | 2 +- test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java | 6 +++--- test/org/apache/coyote/ajp/TesterAjpMessage.java | 13 +++++++++++++ 7 files changed, 27 insertions(+), 9 deletions(-) diff --git a/java/org/apache/coyote/ajp/AjpAprProcessor.java b/java/org/apache/coyote/ajp/AjpAprProcessor.java index 6efd5945f..11c03c89e 100644 --- a/java/org/apache/coyote/ajp/AjpAprProcessor.java +++ b/java/org/apache/coyote/ajp/AjpAprProcessor.java @@ -463,7 +463,7 @@ public class AjpAprProcessor extends AbstractAjpProcessor { read(headerLength); } inputBuffer.get(message.getBuffer(), 0, headerLength); - int messageLength = message.processHeader(); + int messageLength = message.processHeader(true); if (messageLength < 0) { // Invalid AJP header signature // TODO: Throw some exception and close the connection to frontend. diff --git a/java/org/apache/coyote/ajp/AjpMessage.java b/java/org/apache/coyote/ajp/AjpMessage.java index 491e28034..b71cbc63f 100644 --- a/java/org/apache/coyote/ajp/AjpMessage.java +++ b/java/org/apache/coyote/ajp/AjpMessage.java @@ -348,13 +348,18 @@ public class AjpMessage { return buf.length; } - + @Deprecated public int processHeader() { + return processHeader(true); + } + + public int processHeader(boolean toContainer) { pos = 0; int mark = getInt(); len = getInt(); // Verify message signature - if ((mark != 0x1234) && (mark != 0x4142)) { + if ((toContainer && mark != 0x1234) || + (!toContainer && mark != 0x4142)) { log.error(sm.getString("ajpmessage.invalid", "" + mark)); if (log.isDebugEnabled()) { dump("In: "); diff --git a/java/org/apache/coyote/ajp/AjpNioProcessor.java b/java/org/apache/coyote/ajp/AjpNioProcessor.java index a964a2030..152a26c1c 100644 --- a/java/org/apache/coyote/ajp/AjpNioProcessor.java +++ b/java/org/apache/coyote/ajp/AjpNioProcessor.java @@ -465,7 +465,7 @@ public class AjpNioProcessor extends AbstractAjpProcessor { return 0; } - int messageLength = message.processHeader(); + int messageLength = message.processHeader(true); if (messageLength < 0) { // Invalid AJP header signature throw new IOException(sm.getString("ajpmessage.invalidLength", diff --git a/java/org/apache/coyote/ajp/AjpProcessor.java b/java/org/apache/coyote/ajp/AjpProcessor.java index ceb1c2940..785f99c05 100644 --- a/java/org/apache/coyote/ajp/AjpProcessor.java +++ b/java/org/apache/coyote/ajp/AjpProcessor.java @@ -414,7 +414,7 @@ public class AjpProcessor extends AbstractAjpProcessor { read(buf, 0, headerLength); - int messageLength = message.processHeader(); + int messageLength = message.processHeader(true); if (messageLength < 0) { // Invalid AJP header signature // TODO: Throw some exception and close the connection to frontend. diff --git a/test/org/apache/coyote/ajp/SimpleAjpClient.java b/test/org/apache/coyote/ajp/SimpleAjpClient.java index f2cd52116..2953ac7b0 100644 --- a/test/org/apache/coyote/ajp/SimpleAjpClient.java +++ b/test/org/apache/coyote/ajp/SimpleAjpClient.java @@ -149,7 +149,7 @@ public class SimpleAjpClient { read(is, buf, 0, headerLength); - int messageLength = message.processHeader(); + int messageLength = message.processHeader(false); if (messageLength < 0) { throw new IOException("Invalid AJP message length"); } else if (messageLength == 0) { diff --git a/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java b/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java index 0112c8e60..c91b5287c 100644 --- a/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java +++ b/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java @@ -101,7 +101,7 @@ public class TestAbstractAjpProcessor extends TomcatBaseTest { assertEquals((byte) 'B', message.buf[1]); // Set the start position and read the length - message.processHeader(); + message.processHeader(false); // Check the length assertTrue(message.len > 0); @@ -136,7 +136,7 @@ public class TestAbstractAjpProcessor extends TomcatBaseTest { assertEquals((byte) 'B', message.buf[1]); // Set the start position and read the length - message.processHeader(); + message.processHeader(false); // Should be a body chunk message assertEquals(0x03, message.readByte()); @@ -153,7 +153,7 @@ public class TestAbstractAjpProcessor extends TomcatBaseTest { assertEquals((byte) 'A', message.buf[0]); assertEquals((byte) 'B', message.buf[1]); - message.processHeader(); + message.processHeader(false); // Should be an end body message assertEquals(0x05, message.readByte()); diff --git a/test/org/apache/coyote/ajp/TesterAjpMessage.java b/test/org/apache/coyote/ajp/TesterAjpMessage.java index b9053e8fd..8835c642d 100644 --- a/test/org/apache/coyote/ajp/TesterAjpMessage.java +++ b/test/org/apache/coyote/ajp/TesterAjpMessage.java @@ -67,4 +67,17 @@ public class TesterAjpMessage extends AjpMessage { return readString(len); } } + + @Override + public void end() { + len = pos; + int dLen = len - 4; + + buf[0] = (byte) 0x12; + buf[1] = (byte) 0x34; + buf[2] = (byte) ((dLen>>>8) & 0xFF); + buf[3] = (byte) (dLen & 0xFF); + } + + } -- 2.11.0