garyp 01/07/25 23:28:55
Modified: java/src/org/apache/xalan/serialize
WriterToUTF8Buffered.java
Log:
Fix bugzilla bug 2639
(http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2639) where buffer was
overflowing because the expansion of the Unicode characters into multiple UTF8
characters was not being properly taken into account. Many thanks to
Gunnlaugur Thor Briem for his "multiply by three" trick.
Revision Changes Path
1.3 +25 -9
xml-xalan/java/src/org/apache/xalan/serialize/WriterToUTF8Buffered.java
Index: WriterToUTF8Buffered.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/serialize/WriterToUTF8Buffered.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- WriterToUTF8Buffered.java 2001/06/12 19:14:56 1.2
+++ WriterToUTF8Buffered.java 2001/07/26 06:28:55 1.3
@@ -135,20 +135,24 @@
public void write(final int c) throws IOException
{
- if (count >= buf.length)
- {
- flushBuffer();
- }
-
+
if (c < 0x80)
+ {
+ if (count >= buf.length)
+ flushBuffer();
buf[count++] = (byte) (c);
+ }
else if (c < 0x800)
{
+ if (count+1 >= buf.length)
+ flushBuffer();
buf[count++] = (byte) (0xc0 + (c >> 6));
buf[count++] = (byte) (0x80 + (c & 0x3f));
}
else
{
+ if (count+2 >= buf.length)
+ flushBuffer();
buf[count++] = (byte) (0xe0 + (c >> 12));
buf[count++] = (byte) (0x80 + ((c >> 6) & 0x3f));
buf[count++] = (byte) (0x80 + (c & 0x3f));
@@ -241,8 +245,14 @@
public void write(final char chars[], final int start, final int length)
throws java.io.IOException
{
+
+ // We multiply the length by three since this is the maximum length
+ // of the characters that we can put into the buffer. It is possible
+ // for each Unicode character to expand to three bytes.
+
+ int lengthx3 = (length << 1) + length;
- if (length >= buf.length)
+ if (lengthx3 >= buf.length)
{
/* If the request length exceeds the size of the output buffer,
@@ -254,7 +264,7 @@
return;
}
- if (length > buf.length - count)
+ if (lengthx3 > buf.length - count)
{
flushBuffer();
}
@@ -293,8 +303,14 @@
{
final int length = s.length();
+
+ // We multiply the length by three since this is the maximum length
+ // of the characters that we can put into the buffer. It is possible
+ // for each Unicode character to expand to three bytes.
+
+ int lengthx3 = (length << 1) + length;
- if (length >= buf.length)
+ if (lengthx3 >= buf.length)
{
/* If the request length exceeds the size of the output buffer,
@@ -306,7 +322,7 @@
return;
}
- if (length > buf.length - count)
+ if (lengthx3 > buf.length - count)
{
flushBuffer();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]