57abdad
diff -up ./modules/jetty/src/main/java/org/mortbay/jetty/handler/ErrorHandler.java.fix2 ./modules/jetty/src/main/java/org/mortbay/jetty/handler/ErrorHandler.java
57abdad
--- ./modules/jetty/src/main/java/org/mortbay/jetty/handler/ErrorHandler.java.fix2	2009-11-03 12:45:36.000000000 -0500
57abdad
+++ ./modules/jetty/src/main/java/org/mortbay/jetty/handler/ErrorHandler.java	2009-11-03 12:47:35.000000000 -0500
57abdad
@@ -91,8 +91,7 @@ public class ErrorHandler extends Abstra
57abdad
         writer.write("<title>Error ");
57abdad
         writer.write(Integer.toString(code));
57abdad
         writer.write(' ');
57abdad
-        if (message!=null)
57abdad
-            writer.write(deScript(message));
57abdad
+        write(writer,message);
57abdad
         writer.write("</title>\n");    
57abdad
     }
57abdad
 
57abdad
@@ -117,9 +116,9 @@ public class ErrorHandler extends Abstra
57abdad
         writer.write("

HTTP ERROR ");

57abdad
         writer.write(Integer.toString(code));
57abdad
         writer.write("\n

Problem accessing ");

57abdad
-        writer.write(deScript(uri));
57abdad
+        write(writer,uri);
57abdad
         writer.write(". Reason:\n
    ");
57abdad
-        writer.write(deScript(message));
57abdad
+        write(writer,message);
57abdad
         writer.write("

");
57abdad
     }
57abdad
 
57abdad
@@ -135,7 +134,7 @@ public class ErrorHandler extends Abstra
57abdad
             PrintWriter pw = new PrintWriter(sw);
57abdad
             th.printStackTrace(pw);
57abdad
             pw.flush();
57abdad
-            writer.write(deScript(sw.getBuffer().toString()));
57abdad
+            write(writer,sw.getBuffer().toString());
57abdad
             writer.write("\n");
57abdad
 
57abdad
             th =th.getCause();
57abdad
@@ -162,13 +161,34 @@ public class ErrorHandler extends Abstra
57abdad
     }
57abdad
 
57abdad
     /* ------------------------------------------------------------ */
57abdad
-    protected String deScript(String string)
57abdad
+    protected void write(Writer writer,String string)
57abdad
+        throws IOException
57abdad
     {
57abdad
         if (string==null)
57abdad
-            return null;
57abdad
-        string=StringUtil.replace(string, "&", "&");
57abdad
-        string=StringUtil.replace(string, "<", "<");
57abdad
-        string=StringUtil.replace(string, ">", ">");
57abdad
-        return string;
57abdad
+            return;
57abdad
+        
57abdad
+        for (int i=0;i
57abdad
+        {
57abdad
+            char c=string.charAt(i);
57abdad
+            
57abdad
+            switch(c)
57abdad
+            {
57abdad
+                case '&' :
57abdad
+                    writer.write("&");
57abdad
+                    break;
57abdad
+                case '<' :
57abdad
+                    writer.write("<");
57abdad
+                    break;
57abdad
+                case '>' :
57abdad
+                    writer.write(">");
57abdad
+                    break;
57abdad
+                    
57abdad
+                default:
57abdad
+                    if (Character.isISOControl(c) && !Character.isWhitespace(c))
57abdad
+                        writer.write('?');
57abdad
+                    else 
57abdad
+                        writer.write(c);
57abdad
+            }          
57abdad
+        }
57abdad
     }
57abdad
 }
57abdad
diff -up ./modules/jetty/src/main/java/org/mortbay/jetty/HttpParser.java.fix2 ./modules/jetty/src/main/java/org/mortbay/jetty/HttpParser.java
57abdad
--- ./modules/jetty/src/main/java/org/mortbay/jetty/HttpParser.java.fix2	2009-11-03 12:46:07.000000000 -0500
57abdad
+++ ./modules/jetty/src/main/java/org/mortbay/jetty/HttpParser.java	2009-11-03 12:47:35.000000000 -0500
57abdad
@@ -465,7 +465,15 @@ public class HttpParser implements Parse
57abdad
                                         case HttpHeaders.CONTENT_LENGTH_ORDINAL:
57abdad
                                             if (_contentLength != HttpTokens.CHUNKED_CONTENT)
57abdad
                                             {
57abdad
-                                                _contentLength=BufferUtil.toLong(value);
57abdad
+                                                try
57abdad
+                                                {
57abdad
+                                                    _contentLength=BufferUtil.toLong(value);
57abdad
+                                                }
57abdad
+                                                catch(NumberFormatException e)
57abdad
+                                                {
57abdad
+                                                    Log.ignore(e);
57abdad
+                                                    throw new HttpException(HttpServletResponse.SC_BAD_REQUEST);
57abdad
+                                                }
57abdad
                                                 if (_contentLength <= 0)
57abdad
                                                     _contentLength=HttpTokens.NO_CONTENT;
57abdad
                                             }
57abdad
diff -up ./modules/util/src/main/java/org/mortbay/log/StdErrLog.java.fix2 ./modules/util/src/main/java/org/mortbay/log/StdErrLog.java
57abdad
--- ./modules/util/src/main/java/org/mortbay/log/StdErrLog.java.fix2	2009-11-03 12:47:02.000000000 -0500
57abdad
+++ ./modules/util/src/main/java/org/mortbay/log/StdErrLog.java	2009-11-03 12:48:00.000000000 -0500
57abdad
@@ -26,8 +26,10 @@ import org.mortbay.util.DateCache;
57abdad
 public class StdErrLog implements Logger
57abdad
 {    
57abdad
     private static DateCache _dateCache;
57abdad
-    private static boolean debug = System.getProperty("DEBUG",null)!=null;
57abdad
-    private String name;
57abdad
+    private static boolean __debug = System.getProperty("DEBUG",null)!=null;
57abdad
+    private String _name;
57abdad
+    
57abdad
+    StringBuffer _buffer = new StringBuffer();
57abdad
     
57abdad
     static
57abdad
     {
57abdad
@@ -49,44 +51,59 @@ public class StdErrLog implements Logger
57abdad
     
57abdad
     public StdErrLog(String name)
57abdad
     {    
57abdad
-        this.name=name==null?"":name;
57abdad
+        this._name=name==null?"":name;
57abdad
     }
57abdad
     
57abdad
     public boolean isDebugEnabled()
57abdad
     {
57abdad
-        return debug;
57abdad
+        return __debug;
57abdad
     }
57abdad
     
57abdad
     public void setDebugEnabled(boolean enabled)
57abdad
     {
57abdad
-        debug=enabled;
57abdad
+        __debug=enabled;
57abdad
     }
57abdad
     
57abdad
     public void info(String msg,Object arg0, Object arg1)
57abdad
     {
57abdad
         String d=_dateCache.now();
57abdad
         int ms=_dateCache.lastMs();
57abdad
-        System.err.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+":INFO:  "+format(msg,arg0,arg1));
57abdad
+        synchronized(_buffer)
57abdad
+        {
57abdad
+            tag(d,ms,":INFO:");
57abdad
+            format(msg,arg0,arg1);
57abdad
+            System.err.println(_buffer.toString());
57abdad
+        }
57abdad
     }
57abdad
     
57abdad
     public void debug(String msg,Throwable th)
57abdad
     {
57abdad
-        if (debug)
57abdad
+        if (__debug)
57abdad
         {
57abdad
             String d=_dateCache.now();
57abdad
             int ms=_dateCache.lastMs();
57abdad
-            System.err.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+":DEBUG: "+msg);
57abdad
-            if (th!=null) th.printStackTrace();
57abdad
+            synchronized(_buffer)
57abdad
+            {
57abdad
+                tag(d,ms,":DBUG:");
57abdad
+                format(msg);
57abdad
+                format(th);
57abdad
+                System.err.println(_buffer.toString());
57abdad
+            }
57abdad
         }
57abdad
     }
57abdad
     
57abdad
     public void debug(String msg,Object arg0, Object arg1)
57abdad
     {
57abdad
-        if (debug)
57abdad
+        if (__debug)
57abdad
         {
57abdad
             String d=_dateCache.now();
57abdad
             int ms=_dateCache.lastMs();
57abdad
-            System.err.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+":DEBUG: "+format(msg,arg0,arg1));
57abdad
+            synchronized(_buffer)
57abdad
+            {
57abdad
+                tag(d,ms,":DBUG:");
57abdad
+                format(msg,arg0,arg1);
57abdad
+                System.err.println(_buffer.toString());
57abdad
+            }
57abdad
         }
57abdad
     }
57abdad
     
57abdad
@@ -94,42 +111,126 @@ public class StdErrLog implements Logger
57abdad
     {
57abdad
         String d=_dateCache.now();
57abdad
         int ms=_dateCache.lastMs();
57abdad
-        System.err.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+":WARN:  "+format(msg,arg0,arg1));
57abdad
+        synchronized(_buffer)
57abdad
+        {
57abdad
+            tag(d,ms,":WARN:");
57abdad
+            format(msg,arg0,arg1);
57abdad
+            System.err.println(_buffer.toString());
57abdad
+        }
57abdad
     }
57abdad
     
57abdad
     public void warn(String msg, Throwable th)
57abdad
     {
57abdad
         String d=_dateCache.now();
57abdad
         int ms=_dateCache.lastMs();
57abdad
-        System.err.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+":WARN:  "+msg);
57abdad
-        if (th!=null)
57abdad
-            th.printStackTrace();
57abdad
+        synchronized(_buffer)
57abdad
+        {
57abdad
+            tag(d,ms,":WARN:");
57abdad
+            format(msg);
57abdad
+            format(th);
57abdad
+            System.err.println(_buffer.toString());
57abdad
+        }
57abdad
     }
57abdad
-
57abdad
-    private String format(String msg, Object arg0, Object arg1)
57abdad
+    
57abdad
+    private void tag(String d,int ms,String tag)
57abdad
+    {
57abdad
+        _buffer.setLength(0);
57abdad
+        _buffer.append(d);
57abdad
+        if (ms>99)
57abdad
+            _buffer.append('.');
57abdad
+        else if (ms>9)
57abdad
+            _buffer.append(".0");
57abdad
+        else
57abdad
+            _buffer.append(".00");
57abdad
+        _buffer.append(ms).append(tag).append(_name).append(':');
57abdad
+    }
57abdad
+    
57abdad
+    private void format(String msg, Object arg0, Object arg1)
57abdad
     {
57abdad
         int i0=msg.indexOf("{}");
57abdad
         int i1=i0<0?-1:msg.indexOf("{}",i0+2);
57abdad
         
57abdad
-        if (arg1!=null && i1>=0)
57abdad
-            msg=msg.substring(0,i1)+arg1+msg.substring(i1+2);
57abdad
-        if (arg0!=null && i0>=0)
57abdad
-            msg=msg.substring(0,i0)+arg0+msg.substring(i0+2);
57abdad
-        return msg;
57abdad
+        if (i0>=0)
57abdad
+        {
57abdad
+            format(msg.substring(0,i0));
57abdad
+            format(String.valueOf(arg0));
57abdad
+            
57abdad
+            if (i1>=0)
57abdad
+            {
57abdad
+                format(msg.substring(i0+2,i1));
57abdad
+                format(String.valueOf(arg1));
57abdad
+                format(msg.substring(i1+2));
57abdad
+            }
57abdad
+            else
57abdad
+            {
57abdad
+                format(msg.substring(i0+2));
57abdad
+                if (arg1!=null)
57abdad
+                {
57abdad
+                    _buffer.append(' ');
57abdad
+                    format(String.valueOf(arg1));
57abdad
+                }
57abdad
+            }
57abdad
+        }
57abdad
+        else
57abdad
+        {
57abdad
+            format(msg);
57abdad
+            if (arg0!=null)
57abdad
+            {
57abdad
+                _buffer.append(' ');
57abdad
+                format(String.valueOf(arg0));
57abdad
+            }
57abdad
+            if (arg1!=null)
57abdad
+            {
57abdad
+                _buffer.append(' ');
57abdad
+                format(String.valueOf(arg1));
57abdad
+            }
57abdad
+        }
57abdad
+    }
57abdad
+    
57abdad
+    private void format(String msg)
57abdad
+    {
57abdad
+        for (int i=0;i
57abdad
+        {
57abdad
+            char c=msg.charAt(i);
57abdad
+            if (Character.isISOControl(c))
57abdad
+            {
57abdad
+                if (c=='\n')
57abdad
+                    _buffer.append('|');
57abdad
+                else if (c=='\r')
57abdad
+                    _buffer.append('<');
57abdad
+                else
57abdad
+                    _buffer.append('?');
57abdad
+            }
57abdad
+            else
57abdad
+                _buffer.append(c);
57abdad
+        }
57abdad
+    }
57abdad
+    
57abdad
+    private void format(Throwable th)
57abdad
+    {
57abdad
+        _buffer.append('\n');
57abdad
+        format(th.toString());
57abdad
+        StackTraceElement[] elements = th.getStackTrace();
57abdad
+        for (int i=0;elements!=null && i
57abdad
+        {
57abdad
+            _buffer.append("\n\tat ");
57abdad
+            format(elements[i].toString());
57abdad
+        }
57abdad
     }
57abdad
     
57abdad
     public Logger getLogger(String name)
57abdad
     {
57abdad
-        if ((name==null && this.name==null) ||
57abdad
-            (name!=null && name.equals(this.name)))
57abdad
+        if ((name==null && this._name==null) ||
57abdad
+            (name!=null && name.equals(this._name)))
57abdad
             return this;
57abdad
         return new StdErrLog(name);
57abdad
     }
57abdad
     
57abdad
     public String toString()
57abdad
     {
57abdad
-        return "STDERR"+name;
57abdad
+        return "STDERR"+_name;
57abdad
     }
57abdad
+    
57abdad
 
57abdad
 }
57abdad