Revert r1132487 and use Konstantin's suggested fix.
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Mon, 6 Jun 2011 16:53:37 +0000 (16:53 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Mon, 6 Jun 2011 16:53:37 +0000 (16:53 +0000)
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1132700 13f79535-47bb-0310-9956-ffa450edef68

java/org/apache/coyote/http11/AbstractHttp11Processor.java
webapps/docs/changelog.xml

index fb23529..677b711 100644 (file)
@@ -39,6 +39,7 @@ import org.apache.juli.logging.Log;
 import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.buf.Ascii;
 import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.buf.HexUtils;
 import org.apache.tomcat.util.buf.MessageBytes;
 import org.apache.tomcat.util.http.FastHttpDateFormat;
 import org.apache.tomcat.util.http.MimeHeaders;
@@ -993,8 +994,23 @@ public abstract class AbstractHttp11Processor extends AbstractProcessor {
             request.serverName().setChars(hostNameC, 0, valueL);
         } else {
             request.serverName().setChars(hostNameC, 0, colonPos);
-            request.setServerPort(Ascii.parseInt(
-                    valueB, valueS + colonPos + 1, valueL - colonPos - 1));
+            
+            int port = 0;
+            int mult = 1;
+            for (int i = valueL - 1; i > colonPos; i--) {
+                int charValue = HexUtils.getDec(valueB[i + valueS]);
+                if (charValue == -1 || charValue > 9) {
+                    // Invalid character
+                    error = true;
+                    // 400 - Bad request
+                    response.setStatus(400);
+                    adapter.log(request, response, 0);
+                    break;
+                }
+                port = port + (charValue * mult);
+                mult = 10 * mult;
+            }
+            request.setServerPort(port);
         }
 
     }
index bb6a4a3..f05fdd9 100644 (file)
@@ -51,7 +51,7 @@
       </fix>
       <fix>
         When parsing the port in the HTTP host header, treat the port as a base
-        10 integer rather than a hexadecimal one. (rjung/markt) 
+        10 integer rather than a hexadecimal one. (rjung/markt/kkolinko
       </fix>
     </changelog>
   </subsection>