You are viewing a plain text version of this content. The canonical link for it is here.
Posted to apache-bugdb@apache.org by Jon Smirl <jo...@mediaone.net> on 1999/12/21 03:24:23 UTC
mod_jserv/5500: over 1K post data is not being handled correctly
>Number: 5500
>Category: mod_jserv
>Synopsis: over 1K post data is not being handled correctly
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: jserv
>State: open
>Class: sw-bug
>Submitter-Id: apache
>Arrival-Date: Mon Dec 20 18:30:06 PST 1999
>Last-Modified:
>Originator: jonsmirl@mediaone.net
>Organization:
apache
>Release: 1.3.9 1.1b3
>Environment:
Win95, MS JVM
>Description:
I think I've figured out the root of the problem. A fix I submitted about
two months ago is not exactly right. It is revision 1.68
JServeConnection.java. In the original fix I had not allowed for a partial
read fill from the socket. A partial read fill may occur on some OS's if
there is over 1K of post data.
>How-To-Repeat:
post over 1K of data to JServ on Windows
>Fix:
/**
* ServletInputStream implementation as inner class
*/
protected class JServInputStream extends ServletInputStream {
protected InputStream in;
protected int length;
public JServInputStream(int length, InputStream in) {
this.length = length;
this.in = in;
}
public int read() throws IOException
if ((length > 0) || (length == -1)) {
int i = in.read();
length -= i;
return i;
}
return -1;
}
public int read(byte b[]) throws IOException {
if (length == -1)
return in.read(b, 0, b.length);
int len = b.length;
if (len > length)
len = length;
if (len > 0) {
int i = in.read(b, 0, len);
length -= i;
return i;
}
return 0;
}
public int read(byte b[], int off, int len) throws IOException {
if (length == -1)
return in.read(b, off, len);
if (len > length)
len = length;
if (len > 0) {
int i = in.read(b,off,len);
length -= i;
return i;
}
return 0;
}
public long skip(long n) throws IOException {
if (length == -1)
return in.skip(n);
if (n > length)
n = length;
length -= n;
if (n > 0) {
long i = in.skip(n);
length -= i;
return i;
}
return 0;
}
public void close() throws IOException {
// Ignore closing of the input stream since it also
// close the output stream.
// conn.in.close();
}
/**
We must implement this method because java.io.InputStream
javadocs says that this will return 0. Since we use a long
internally, it must be cast to an int. ugly. -JSS
*/
public int available() throws IOException {
if (length == -1)
return in.available();
return length;
}
}
>Audit-Trail:
>Unformatted:
[In order for any reply to be added to the PR database, you need]
[to include <ap...@Apache.Org> in the Cc line and make sure the]
[subject line starts with the report component and number, with ]
[or without any 'Re:' prefixes (such as "general/1098:" or ]
["Re: general/1098:"). If the subject doesn't match this ]
[pattern, your message will be misfiled and ignored. The ]
["apbugs" address is not added to the Cc line of messages from ]
[the database automatically because of the potential for mail ]
[loops. If you do not include this Cc, your reply may be ig- ]
[nored unless you are responding to an explicit request from a ]
[developer. Reply only with text; DO NOT SEND ATTACHMENTS! ]