diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/catalina/connector/InputBuffer.java apache-tomcat-9.0.43-src/java/org/apache/catalina/connector/InputBuffer.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/catalina/connector/InputBuffer.java 2021-01-28 21:36:21.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/catalina/connector/InputBuffer.java 2021-10-18 22:46:03.740843061 +0200 @@ -389,10 +389,10 @@ public class InputBuffer extends Reader } int n = Math.min(to.remaining(), bb.remaining()); int orgLimit = bb.limit(); - bb.limit(bb.position() + n); + ((Buffer)bb).limit(bb.position() + n); to.put(bb); - bb.limit(orgLimit); - to.limit(to.position()).position(to.position() - n); + ((Buffer)bb).limit(orgLimit); + ((Buffer)to).limit(to.position()).position(to.position() - n); return n; } @@ -488,11 +488,11 @@ public class InputBuffer extends Reader long nRead = 0; while (nRead < n) { if (cb.remaining() >= n) { - cb.position(cb.position() + (int) n); + ((Buffer)cb).position(cb.position() + (int) n); nRead = n; } else { nRead += cb.remaining(); - cb.position(cb.limit()); + ((Buffer)cb).position(cb.limit()); int nb = realReadChars(); if (nb < 0) { break; @@ -533,7 +533,7 @@ public class InputBuffer extends Reader } else { if ((cb.capacity() > (2 * size)) && (cb.remaining()) < (cb.position())) { cb.compact(); - cb.flip(); + ((Buffer)cb).flip(); } } readLimit = cb.position() + readAheadLimit + size; @@ -554,7 +554,7 @@ public class InputBuffer extends Reader markPos = -1; throw new IOException(); } else { - cb.position(markPos); + ((Buffer)cb).position(markPos); } } else { clear(bb); @@ -672,10 +672,10 @@ public class InputBuffer extends Reader CharBuffer tmp = CharBuffer.allocate(newSize); int oldPosition = cb.position(); - cb.position(0); + ((Buffer)cb).position(0); tmp.put(cb); - tmp.flip(); - tmp.position(oldPosition); + ((Buffer)tmp).flip(); + ((Buffer)tmp).position(oldPosition); cb = tmp; tmp = null; } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/catalina/connector/OutputBuffer.java apache-tomcat-9.0.43-src/java/org/apache/catalina/connector/OutputBuffer.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/catalina/connector/OutputBuffer.java 2021-01-28 21:36:21.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/catalina/connector/OutputBuffer.java 2021-10-18 22:46:03.740843061 +0200 @@ -761,10 +761,10 @@ public class OutputBuffer extends Writer int limit = bb.capacity(); int fromLimit = from.limit(); while (from.remaining() >= limit) { - from.limit(from.position() + limit); + ((Buffer)from).limit(from.position() + limit); realWriteBytes(from.slice()); - from.position(from.limit()); - from.limit(fromLimit); + ((Buffer)from).position(from.limit()); + ((Buffer)from).limit(fromLimit); } if (from.remaining() > 0) { diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java apache-tomcat-9.0.43-src/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java 2021-01-28 21:36:25.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java 2021-10-18 22:46:03.744843076 +0200 @@ -18,6 +18,7 @@ package org.apache.catalina.tribes.transport.nio; import java.io.IOException; import java.net.SocketAddress; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.CancelledKeyException; import java.nio.channels.DatagramChannel; @@ -80,7 +81,7 @@ public class NioReplicationTask extends buffer = ByteBuffer.allocate(size); } } else { - buffer.clear(); + ((Buffer)buffer).clear(); } if (key == null) { return; // just in case @@ -156,30 +157,30 @@ public class NioReplicationTask extends reader.access(); ReadableByteChannel channel = (ReadableByteChannel) key.channel(); int count=-1; - buffer.clear(); // make buffer empty + ((Buffer)buffer).clear(); // make buffer empty SocketAddress saddr = null; if (channel instanceof SocketChannel) { // loop while data available, channel is non-blocking while ((count = channel.read (buffer)) > 0) { - buffer.flip(); // make buffer readable + ((Buffer)buffer).flip(); // make buffer readable if ( buffer.hasArray() ) reader.append(buffer.array(),0,count,false); else reader.append(buffer,count,false); - buffer.clear(); // make buffer empty + ((Buffer)buffer).clear(); // make buffer empty //do we have at least one package? if ( reader.hasPackage() ) break; } } else if (channel instanceof DatagramChannel) { DatagramChannel dchannel = (DatagramChannel)channel; saddr = dchannel.receive(buffer); - buffer.flip(); // make buffer readable + ((Buffer)buffer).flip(); // make buffer readable if ( buffer.hasArray() ) reader.append(buffer.array(),0,buffer.limit()-buffer.position(),false); else reader.append(buffer,buffer.limit()-buffer.position(),false); - buffer.clear(); // make buffer empty + ((Buffer)buffer).clear(); // make buffer empty //did we get a package count = reader.hasPackage()?1:-1; } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/catalina/tribes/transport/nio/NioSender.java apache-tomcat-9.0.43-src/java/org/apache/catalina/tribes/transport/nio/NioSender.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/catalina/tribes/transport/nio/NioSender.java 2021-01-28 21:36:25.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/catalina/tribes/transport/nio/NioSender.java 2021-10-18 22:46:03.744843076 +0200 @@ -20,6 +20,7 @@ package org.apache.catalina.tribes.trans import java.io.EOFException; import java.io.IOException; import java.net.InetSocketAddress; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import java.nio.channels.SelectionKey; @@ -173,9 +174,9 @@ public class NioSender extends AbstractS if ( read == -1 ) throw new IOException(sm.getString("nioSender.unable.receive.ack")); //no data read else if ( read == 0 ) return false; - readbuf.flip(); + ((Buffer)readbuf).flip(); ackbuf.append(readbuf,read); - readbuf.clear(); + ((Buffer)readbuf).clear(); if (ackbuf.doesPackageExist() ) { byte[] ackcmd = ackbuf.extractDataPackage(true).getBytes(); boolean ack = Arrays.equals(ackcmd,org.apache.catalina.tribes.transport.Constants.ACK_DATA); @@ -225,12 +226,12 @@ public class NioSender extends AbstractS if ( readbuf == null ) { readbuf = getReadBuffer(); } else { - readbuf.clear(); + ((Buffer)readbuf).clear(); } if ( writebuf == null ) { writebuf = getWriteBuffer(); } else { - writebuf.clear(); + ((Buffer)writebuf).clear(); } if (isUdpBased()) { @@ -317,8 +318,8 @@ public class NioSender extends AbstractS if ( isConnected() && readbuf == null) { readbuf = getReadBuffer(); } - if ( readbuf != null ) readbuf.clear(); - if ( writebuf != null ) writebuf.clear(); + if ( readbuf != null ) ((Buffer)readbuf).clear(); + if ( writebuf != null ) ((Buffer)writebuf).clear(); current = null; ackbuf.clear(); remaining = 0; @@ -357,7 +358,7 @@ public class NioSender extends AbstractS remaining = length; ackbuf.clear(); if (writebuf != null) { - writebuf.clear(); + ((Buffer)writebuf).clear(); } else { writebuf = getBuffer(length); } @@ -367,7 +368,7 @@ public class NioSender extends AbstractS // TODO use ByteBuffer.wrap to avoid copying the data. writebuf.put(data,offset,length); - writebuf.flip(); + ((Buffer)writebuf).flip(); if (isConnected()) { if (isUdpBased()) dataChannel.register(getSelector(), SelectionKey.OP_WRITE, this); diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/ajp/AjpProcessor.java apache-tomcat-9.0.43-src/java/org/apache/coyote/ajp/AjpProcessor.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/ajp/AjpProcessor.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/ajp/AjpProcessor.java 2021-10-18 22:46:03.744843076 +0200 @@ -21,6 +21,7 @@ import java.io.EOFException; import java.io.IOException; import java.io.InterruptedIOException; import java.net.InetAddress; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.security.NoSuchProviderException; import java.security.cert.CertificateException; @@ -1255,7 +1256,7 @@ public class AjpProcessor extends Abstra responseMessage.reset(); responseMessage.appendByte(Constants.JK_AJP13_SEND_BODY_CHUNK); - chunk.limit(chunk.position() + thisTime); + ((Buffer)chunk).limit(chunk.position() + thisTime); responseMessage.appendBytes(chunk); responseMessage.end(); socketWrapper.write(blocking, responseMessage.getBuffer(), 0, responseMessage.getLen()); diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/filters/BufferedInputFilter.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/filters/BufferedInputFilter.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/filters/BufferedInputFilter.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/filters/BufferedInputFilter.java 2021-10-18 22:46:03.744843076 +0200 @@ -18,6 +18,7 @@ package org.apache.coyote.http11.filters; import java.io.IOException; +import java.nio.Buffer; import java.nio.BufferOverflowException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; @@ -68,7 +69,7 @@ public class BufferedInputFilter impleme public void setLimit(int limit) { if (buffered == null) { buffered = ByteBuffer.allocate(limit); - buffered.flip(); + ((Buffer)buffered).flip(); } } @@ -84,9 +85,9 @@ public class BufferedInputFilter impleme // save off the Request body try { while (buffer.doRead(this) >= 0) { - buffered.mark().position(buffered.limit()).limit(buffered.capacity()); + ((Buffer)buffered).mark().position(buffered.limit()).limit(buffered.capacity()); buffered.put(tempRead); - buffered.limit(buffered.position()).reset(); + ((Buffer)buffered).limit(buffered.position()).reset(); tempRead = null; } } catch(IOException | BufferOverflowException ioe) { @@ -121,7 +122,7 @@ public class BufferedInputFilter impleme if (buffered.capacity() > 65536) { buffered = null; } else { - buffered.position(0).limit(0); + ((Buffer)buffered).position(0).limit(0); } } hasRead = false; diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java 2021-10-18 22:46:03.744843076 +0200 @@ -18,6 +18,7 @@ package org.apache.coyote.http11.filters import java.io.EOFException; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.Locale; @@ -184,14 +185,14 @@ public class ChunkedInputFilter implemen if (readChunk != handler.getByteBuffer()) { handler.setByteBuffer(readChunk.duplicate()); } - readChunk.position(readChunk.limit()); + ((Buffer)readChunk).position(readChunk.limit()); } else { result = remaining; if (readChunk != handler.getByteBuffer()) { handler.setByteBuffer(readChunk.duplicate()); handler.getByteBuffer().limit(readChunk.position() + remaining); } - readChunk.position(readChunk.position() + remaining); + ((Buffer)readChunk).position(readChunk.position() + remaining); remaining = 0; //we need a CRLF if ((readChunk.position() + 1) >= readChunk.limit()) { @@ -272,7 +273,7 @@ public class ChunkedInputFilter implemen public void recycle() { remaining = 0; if (readChunk != null) { - readChunk.position(0).limit(0); + ((Buffer)readChunk).position(0).limit(0); } endChunk = false; needCRLFParse = false; @@ -372,7 +373,7 @@ public class ChunkedInputFilter implemen // Parsing the CRLF increments pos if (!eol) { - readChunk.position(readChunk.position() + 1); + ((Buffer)readChunk).position(readChunk.position() + 1); } } @@ -424,7 +425,7 @@ public class ChunkedInputFilter implemen throwIOException(sm.getString("chunkedInputFilter.invalidCrlf")); } - readChunk.position(readChunk.position() + 1); + ((Buffer)readChunk).position(readChunk.position() + 1); } } @@ -493,7 +494,7 @@ public class ChunkedInputFilter implemen trailingHeaders.append(chr); } - readChunk.position(readChunk.position() + 1); + ((Buffer)readChunk).position(readChunk.position() + 1); } int colonPos = trailingHeaders.getEnd(); @@ -522,7 +523,7 @@ public class ChunkedInputFilter implemen chr = readChunk.get(readChunk.position()); if ((chr == Constants.SP) || (chr == Constants.HT)) { - readChunk.position(readChunk.position() + 1); + ((Buffer)readChunk).position(readChunk.position() + 1); // If we swallow whitespace, make sure it counts towards the // limit placed on trailing header size int newlimit = trailingHeaders.getLimit() -1; @@ -558,7 +559,7 @@ public class ChunkedInputFilter implemen } if (!eol) { - readChunk.position(readChunk.position() + 1); + ((Buffer)readChunk).position(readChunk.position() + 1); } } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java 2021-10-18 22:46:03.744843076 +0200 @@ -18,6 +18,7 @@ package org.apache.coyote.http11.filters import java.io.IOException; import java.io.OutputStreamWriter; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.HashSet; @@ -106,12 +107,12 @@ public class ChunkedOutputFilter impleme int pos = calculateChunkHeader(result); - chunkHeader.position(pos).limit(10); + ((Buffer)chunkHeader).position(pos).limit(10); buffer.doWrite(chunkHeader); buffer.doWrite(chunk); - chunkHeader.position(8).limit(10); + ((Buffer)chunkHeader).position(8).limit(10); buffer.doWrite(chunkHeader); return result; @@ -171,10 +172,10 @@ public class ChunkedOutputFilter impleme if (trailerFields == null) { // Write end chunk buffer.doWrite(endChunk); - endChunk.position(0).limit(endChunk.capacity()); + ((Buffer)endChunk).position(0).limit(endChunk.capacity()); } else { buffer.doWrite(lastChunk); - lastChunk.position(0).limit(lastChunk.capacity()); + ((Buffer)lastChunk).position(0).limit(lastChunk.capacity()); ByteArrayOutputStream baos = new ByteArrayOutputStream(1024); OutputStreamWriter osw = new OutputStreamWriter(baos, StandardCharsets.ISO_8859_1); @@ -194,7 +195,7 @@ public class ChunkedOutputFilter impleme buffer.doWrite(ByteBuffer.wrap(baos.toByteArray())); buffer.doWrite(crlfChunk); - crlfChunk.position(0).limit(crlfChunk.capacity()); + ((Buffer)crlfChunk).position(0).limit(crlfChunk.capacity()); } buffer.end(); } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/filters/IdentityInputFilter.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/filters/IdentityInputFilter.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/filters/IdentityInputFilter.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/filters/IdentityInputFilter.java 2021-10-18 22:46:03.744843076 +0200 @@ -18,6 +18,7 @@ package org.apache.coyote.http11.filters; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; @@ -104,7 +105,7 @@ public class IdentityInputFilter impleme // The chunk is longer than the number of bytes remaining // in the body; changing the chunk length to the number // of bytes remaining - handler.getByteBuffer().limit(handler.getByteBuffer().position() + (int) remaining); + ((Buffer)(handler.getByteBuffer())).limit(handler.getByteBuffer().position() + (int) remaining); result = (int) remaining; } else { result = nRead; @@ -116,7 +117,7 @@ public class IdentityInputFilter impleme // No more bytes left to be read : return -1 and clear the // buffer if (handler.getByteBuffer() != null) { - handler.getByteBuffer().position(0).limit(0); + ((Buffer)(handler.getByteBuffer())).position(0).limit(0); } result = -1; } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java 2021-10-18 22:46:03.744843076 +0200 @@ -17,6 +17,7 @@ package org.apache.coyote.http11.filters; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import org.apache.coyote.Response; @@ -64,7 +65,7 @@ public class IdentityOutputFilter implem // The chunk is longer than the number of bytes remaining // in the body; changing the chunk length to the number // of bytes remaining - chunk.limit(chunk.position() + (int) remaining); + ((Buffer)chunk).limit(chunk.position() + (int) remaining); result = (int) remaining; remaining = 0; } else { @@ -74,8 +75,8 @@ public class IdentityOutputFilter implem } else { // No more bytes left to be written : return -1 and clear the // buffer - chunk.position(0); - chunk.limit(0); + ((Buffer)chunk).position(0); + ((Buffer)chunk).limit(0); result = -1; } } else { diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java 2021-10-18 22:46:03.744843076 +0200 @@ -18,6 +18,7 @@ package org.apache.coyote.http11.filters; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import org.apache.coyote.InputBuffer; @@ -51,7 +52,7 @@ public class SavedRequestInputFilter imp return -1; ByteBuffer byteBuffer = handler.getByteBuffer(); - byteBuffer.position(byteBuffer.limit()).limit(byteBuffer.capacity()); + ((Buffer)byteBuffer).position(byteBuffer.limit()).limit(byteBuffer.capacity()); input.subtract(byteBuffer); return byteBuffer.remaining(); diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/Http11InputBuffer.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/Http11InputBuffer.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/Http11InputBuffer.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/Http11InputBuffer.java 2021-10-18 22:46:03.744843076 +0200 @@ -18,6 +18,7 @@ package org.apache.coyote.http11; import java.io.EOFException; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.Arrays; @@ -264,7 +265,7 @@ public class Http11InputBuffer implement activeFilters[i].recycle(); } - byteBuffer.limit(0).position(0); + ((Buffer)byteBuffer).limit(0).position(0); lastActiveFilter = -1; swallowInput = true; @@ -298,10 +299,10 @@ public class Http11InputBuffer implement if (byteBuffer.remaining() > 0) { // Copy leftover bytes to the beginning of the buffer byteBuffer.compact(); - byteBuffer.flip(); + ((Buffer)byteBuffer).flip(); } else { // Reset position and limit to 0 - byteBuffer.position(0).limit(0); + ((Buffer)byteBuffer).position(0).limit(0); } } @@ -385,7 +386,7 @@ public class Http11InputBuffer implement } chr = byteBuffer.get(); } while ((chr == Constants.CR) || (chr == Constants.LF)); - byteBuffer.position(byteBuffer.position() - 1); + ((Buffer)byteBuffer).position(byteBuffer.position() - 1); parsingRequestLineStart = byteBuffer.position(); parsingRequestLinePhase = 2; @@ -431,7 +432,7 @@ public class Http11InputBuffer implement chr = byteBuffer.get(); if (!(chr == Constants.SP || chr == Constants.HT)) { space = false; - byteBuffer.position(byteBuffer.position() - 1); + ((Buffer)byteBuffer).position(byteBuffer.position() - 1); } } parsingRequestLineStart = byteBuffer.position(); @@ -525,7 +526,7 @@ public class Http11InputBuffer implement byte chr = byteBuffer.get(); if (!(chr == Constants.SP || chr == Constants.HT)) { space = false; - byteBuffer.position(byteBuffer.position() - 1); + ((Buffer)byteBuffer).position(byteBuffer.position() - 1); } } parsingRequestLineStart = byteBuffer.position(); @@ -642,7 +643,7 @@ public class Http11InputBuffer implement if (swallowInput && (lastActiveFilter != -1)) { int extraBytes = (int) activeFilters[lastActiveFilter].end(); - byteBuffer.position(byteBuffer.position() - extraBytes); + ((Buffer)byteBuffer).position(byteBuffer.position() - extraBytes); } } @@ -744,7 +745,7 @@ public class Http11InputBuffer implement wrapper.getSocketBufferHandler().getReadBuffer().capacity(); if (byteBuffer == null || byteBuffer.capacity() < bufLength) { byteBuffer = ByteBuffer.allocate(bufLength); - byteBuffer.position(0).limit(0); + ((Buffer)byteBuffer).position(0).limit(0); } } @@ -777,14 +778,14 @@ public class Http11InputBuffer implement throw new IllegalArgumentException(sm.getString("iib.requestheadertoolarge.error")); } } else { - byteBuffer.limit(end).position(end); + ((Buffer)byteBuffer).limit(end).position(end); } - byteBuffer.mark(); + ((Buffer)byteBuffer).mark(); if (byteBuffer.position() < byteBuffer.limit()) { - byteBuffer.position(byteBuffer.limit()); + ((Buffer)byteBuffer).position(byteBuffer.limit()); } - byteBuffer.limit(byteBuffer.capacity()); + ((Buffer)byteBuffer).limit(byteBuffer.capacity()); SocketWrapperBase socketWrapper = this.wrapper; int nRead = -1; if (socketWrapper != null) { @@ -792,7 +793,7 @@ public class Http11InputBuffer implement } else { throw new CloseNowException(sm.getString("iib.eof.error")); } - byteBuffer.limit(byteBuffer.position()).reset(); + ((Buffer)byteBuffer).limit(byteBuffer.position()).reset(); if (log.isDebugEnabled()) { log.debug("Received [" @@ -838,10 +839,10 @@ public class Http11InputBuffer implement } else { if (prevChr == Constants.CR) { // Must have read two bytes (first was CR, second was not LF) - byteBuffer.position(byteBuffer.position() - 2); + ((Buffer)byteBuffer).position(byteBuffer.position() - 2); } else { // Must have only read one byte - byteBuffer.position(byteBuffer.position() - 1); + ((Buffer)byteBuffer).position(byteBuffer.position() - 1); } break; } @@ -884,7 +885,7 @@ public class Http11InputBuffer implement // Non-token characters are illegal in header names // Parsing continues so the error can be reported in context headerData.lastSignificantChar = pos; - byteBuffer.position(byteBuffer.position() - 1); + ((Buffer)byteBuffer).position(byteBuffer.position() - 1); // skipLine() will handle the error return skipLine(); } @@ -922,7 +923,7 @@ public class Http11InputBuffer implement chr = byteBuffer.get(); if (!(chr == Constants.SP || chr == Constants.HT)) { headerParsePos = HeaderParsePosition.HEADER_VALUE; - byteBuffer.position(byteBuffer.position() - 1); + ((Buffer)byteBuffer).position(byteBuffer.position() - 1); break; } } @@ -1153,7 +1154,7 @@ public class Http11InputBuffer implement int length = byteBuffer.remaining(); handler.setByteBuffer(byteBuffer.duplicate()); - byteBuffer.position(byteBuffer.limit()); + ((Buffer)byteBuffer).position(byteBuffer.limit()); return length; } @@ -1180,12 +1181,12 @@ public class Http11InputBuffer implement @Override public void expand(int size) { if (byteBuffer.capacity() >= size) { - byteBuffer.limit(size); + ((Buffer)byteBuffer).limit(size); } ByteBuffer temp = ByteBuffer.allocate(size); temp.put(byteBuffer); byteBuffer = temp; - byteBuffer.mark(); + ((Buffer)byteBuffer).mark(); temp = null; } } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/Http11OutputBuffer.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/Http11OutputBuffer.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http11/Http11OutputBuffer.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http11/Http11OutputBuffer.java 2021-10-18 22:46:03.744843076 +0200 @@ -17,6 +17,7 @@ package org.apache.coyote.http11; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.Arrays; @@ -245,7 +246,7 @@ public class Http11OutputBuffer implemen * headers so the error response can be written. */ void resetHeaderBuffer() { - headerBuffer.position(0).limit(headerBuffer.capacity()); + ((Buffer)headerBuffer).position(0).limit(headerBuffer.capacity()); } @@ -273,7 +274,7 @@ public class Http11OutputBuffer implemen // Recycle response object response.recycle(); // Reset pointers - headerBuffer.position(0).limit(headerBuffer.capacity()); + ((Buffer)headerBuffer).position(0).limit(headerBuffer.capacity()); lastActiveFilter = -1; ackSent = false; responseFinished = false; @@ -310,7 +311,7 @@ public class Http11OutputBuffer implemen if (headerBuffer.position() > 0) { // Sending the response header buffer - headerBuffer.flip(); + ((Buffer)headerBuffer).flip(); try { SocketWrapperBase socketWrapper = this.socketWrapper; if (socketWrapper != null) { @@ -319,7 +320,7 @@ public class Http11OutputBuffer implemen throw new CloseNowException(sm.getString("iob.failedwrite")); } } finally { - headerBuffer.position(0).limit(headerBuffer.capacity()); + ((Buffer)headerBuffer).position(0).limit(headerBuffer.capacity()); } } } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/HpackDecoder.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/HpackDecoder.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/HpackDecoder.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/HpackDecoder.java 2021-10-18 22:46:03.744843076 +0200 @@ -16,6 +16,7 @@ */ package org.apache.coyote.http2; +import java.nio.Buffer; import java.nio.ByteBuffer; import org.apache.tomcat.util.res.StringManager; @@ -97,10 +98,10 @@ public class HpackDecoder { byte b = buffer.get(); if ((b & 0b10000000) != 0) { //if the first bit is set it is an indexed header field - buffer.position(buffer.position() - 1); //unget the byte + ((Buffer)buffer).position(buffer.position() - 1); //unget the byte int index = Hpack.decodeInteger(buffer, 7); //prefix is 7 if (index == -1) { - buffer.position(originalPos); + ((Buffer)buffer).position(originalPos); return; } else if(index == 0) { throw new HpackException( @@ -111,12 +112,12 @@ public class HpackDecoder { //Literal Header Field with Incremental Indexing String headerName = readHeaderName(buffer, 6); if (headerName == null) { - buffer.position(originalPos); + ((Buffer)buffer).position(originalPos); return; } String headerValue = readHpackString(buffer); if (headerValue == null) { - buffer.position(originalPos); + ((Buffer)buffer).position(originalPos); return; } emitHeader(headerName, headerValue); @@ -125,12 +126,12 @@ public class HpackDecoder { //Literal Header Field without Indexing String headerName = readHeaderName(buffer, 4); if (headerName == null) { - buffer.position(originalPos); + ((Buffer)buffer).position(originalPos); return; } String headerValue = readHpackString(buffer); if (headerValue == null) { - buffer.position(originalPos); + ((Buffer)buffer).position(originalPos); return; } emitHeader(headerName, headerValue); @@ -138,12 +139,12 @@ public class HpackDecoder { //Literal Header Field never indexed String headerName = readHeaderName(buffer, 4); if (headerName == null) { - buffer.position(originalPos); + ((Buffer)buffer).position(originalPos); return; } String headerValue = readHpackString(buffer); if (headerValue == null) { - buffer.position(originalPos); + ((Buffer)buffer).position(originalPos); return; } emitHeader(headerName, headerValue); @@ -162,10 +163,10 @@ public class HpackDecoder { if (headerCount != 0) { throw new HpackException(sm.getString("hpackdecoder.tableSizeUpdateNotAtStart")); } - buffer.position(buffer.position() - 1); //unget the byte + ((Buffer)buffer).position(buffer.position() - 1); //unget the byte int size = Hpack.decodeInteger(buffer, 5); if (size == -1) { - buffer.position(originalPos); + ((Buffer)buffer).position(originalPos); return false; } if (size > maxMemorySizeHard) { @@ -195,7 +196,7 @@ public class HpackDecoder { } private String readHeaderName(ByteBuffer buffer, int prefixLength) throws HpackException { - buffer.position(buffer.position() - 1); //unget the byte + ((Buffer)buffer).position(buffer.position() - 1); //unget the byte int index = Hpack.decodeInteger(buffer, prefixLength); if (index == -1) { return null; diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/HPackHuffman.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/HPackHuffman.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/HPackHuffman.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/HPackHuffman.java 2021-10-18 22:46:03.748843092 +0200 @@ -16,6 +16,7 @@ */ package org.apache.coyote.http2; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.HashSet; @@ -482,7 +483,7 @@ public class HPackHuffman { int rem = code.length; while (rem > 0) { if (!buffer.hasRemaining()) { - buffer.position(start); + ((Buffer)buffer).position(start); return false; } int remainingInByte = 8 - bytePos; @@ -503,7 +504,7 @@ public class HPackHuffman { } if (bytePos == 8) { if (!buffer.hasRemaining()) { - buffer.position(start); + ((Buffer)buffer).position(start); return false; } buffer.put(currentBufferByte); @@ -513,14 +514,14 @@ public class HPackHuffman { if (buffer.position() - start > toEncode.length()) { //the encoded version is longer than the original //just return false - buffer.position(start); + ((Buffer)buffer).position(start); return false; } } if (bytePos > 0) { //add the EOS bytes if we have not finished on a single byte if (!buffer.hasRemaining()) { - buffer.position(start); + ((Buffer)buffer).position(start); return false; } buffer.put((byte) (currentBufferByte | ((0xFF) >> bytePos))); diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/Hpack.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/Hpack.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/Hpack.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/Hpack.java 2021-10-18 22:46:03.748843092 +0200 @@ -16,6 +16,7 @@ */ package org.apache.coyote.http2; +import java.nio.Buffer; import java.nio.ByteBuffer; import org.apache.tomcat.util.res.StringManager; @@ -165,7 +166,7 @@ final class Hpack { if (source.remaining() == 0) { //we have run out of data //reset - source.position(sp); + ((Buffer)source).position(sp); return -1; } b = source.get(); diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/Http2AsyncParser.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/Http2AsyncParser.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/Http2AsyncParser.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/Http2AsyncParser.java 2021-10-18 22:46:03.748843092 +0200 @@ -17,6 +17,7 @@ package org.apache.coyote.http2; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.CompletionHandler; import java.util.concurrent.TimeUnit; @@ -103,7 +104,7 @@ class Http2AsyncParser extends Http2Pars public void completed(Long result, Void attachment) { if (streamException || error == null) { ByteBuffer payload = buffers[2]; - payload.flip(); + ((Buffer)payload).flip(); try { if (streamException) { swallow(streamId, payloadSize, false, payload); @@ -233,7 +234,7 @@ class Http2AsyncParser extends Http2Pars public void completed(Long result, Void attachment) { if (streamException || error == null) { ByteBuffer payload = buffers[1]; - payload.flip(); + ((Buffer)payload).flip(); try { boolean continueParsing; do { @@ -287,7 +288,7 @@ class Http2AsyncParser extends Http2Pars if (payload.remaining() - 9 >= payloadSize) { continueParsing = true; // Now go over frame header - payload.position(payload.position() + 9); + ((Buffer)payload).position(payload.position() + 9); try { validateFrame(null, frameType, streamId, flags, payloadSize); } catch (StreamException e) { diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java 2021-10-18 22:46:03.748843092 +0200 @@ -17,6 +17,7 @@ package org.apache.coyote.http2; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.CompletionHandler; import java.nio.channels.FileChannel; @@ -218,11 +219,11 @@ public class Http2AsyncUpgradeHandler ex if (writeable) { ByteUtil.set31Bits(header, 5, stream.getIdAsInt()); int orgLimit = data.limit(); - data.limit(data.position() + len); + ((Buffer)data).limit(data.position() + len); socketWrapper.write(BlockingMode.BLOCK, protocol.getWriteTimeout(), TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, applicationErrorCompletion, ByteBuffer.wrap(header), data); - data.limit(orgLimit); + ((Buffer)data).limit(orgLimit); handleAsyncException(); } } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/Http2Parser.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/Http2Parser.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/Http2Parser.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/Http2Parser.java 2021-10-18 22:46:03.748843092 +0200 @@ -17,6 +17,7 @@ package org.apache.coyote.http2; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; @@ -192,9 +193,9 @@ class Http2Parser { input.fill(true, dest, dataLength); } else { int oldLimit = buffer.limit(); - buffer.limit(buffer.position() + dataLength); + ((Buffer)buffer).limit(buffer.position() + dataLength); dest.put(buffer); - buffer.limit(oldLimit); + ((Buffer)buffer).limit(oldLimit); } // Process padding before sending any notifications in case // padding is invalid. @@ -475,12 +476,12 @@ class Http2Parser { input.fill(true, headerReadBuffer, toRead); } else { int oldLimit = buffer.limit(); - buffer.limit(buffer.position() + toRead); + ((Buffer)buffer).limit(buffer.position() + toRead); headerReadBuffer.put(buffer); - buffer.limit(oldLimit); + ((Buffer)buffer).limit(oldLimit); } // switch to read mode - headerReadBuffer.flip(); + ((Buffer)headerReadBuffer).flip(); try { hpackDecoder.decode(headerReadBuffer); } catch (HpackException hpe) { @@ -550,7 +551,7 @@ class Http2Parser { return; } if (!mustBeZero && byteBuffer != null) { - byteBuffer.position(byteBuffer.position() + len); + ((Buffer)byteBuffer).position(byteBuffer.position() + len); } else { int read = 0; byte[] buffer = new byte[1024]; @@ -710,7 +711,7 @@ class Http2Parser { default boolean fill(boolean block, ByteBuffer data, int len) throws IOException { boolean result = fill(block, data.array(), data.arrayOffset() + data.position(), len); if (result) { - data.position(data.position() + len); + ((Buffer)data).position(data.position() + len); } return result; } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/Http2UpgradeHandler.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/Http2UpgradeHandler.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/Http2UpgradeHandler.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/Http2UpgradeHandler.java 2021-10-18 22:46:03.748843092 +0200 @@ -18,6 +18,7 @@ package org.apache.coyote.http2; import java.io.EOFException; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.HashSet; @@ -770,9 +771,9 @@ class Http2UpgradeHandler extends Abstra try { socketWrapper.write(true, header, 0, header.length); int orgLimit = data.limit(); - data.limit(data.position() + len); + ((Buffer)data).limit(data.position() + len); socketWrapper.write(true, data); - data.limit(orgLimit); + ((Buffer)data).limit(orgLimit); socketWrapper.flush(true); } catch (IOException ioe) { handleAppInitiatedIOException(ioe); @@ -1919,7 +1920,7 @@ class Http2UpgradeHandler extends Abstra } catch (IOException ioe) { handleAppInitiatedIOException(ioe); } - payload.clear(); + ((Buffer)payload).clear(); } @Override diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/Stream.java apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/Stream.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/http2/Stream.java 2021-01-28 21:36:26.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/http2/Stream.java 2021-10-18 22:46:03.748843092 +0200 @@ -17,6 +17,7 @@ package org.apache.coyote.http2; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.security.AccessController; @@ -810,9 +811,9 @@ class Stream extends AbstractNonZeroStre int chunkLimit = chunk.limit(); while (chunk.remaining() > 0) { int thisTime = Math.min(buffer.remaining(), chunk.remaining()); - chunk.limit(chunk.position() + thisTime); + ((Buffer)chunk).limit(chunk.position() + thisTime); buffer.put(chunk); - chunk.limit(chunkLimit); + ((Buffer)chunk).limit(chunkLimit); if (chunk.remaining() > 0 && !buffer.hasRemaining()) { // Only flush if we have more data to write and the buffer // is full @@ -882,7 +883,7 @@ class Stream extends AbstractNonZeroStre // Buffer is empty. Nothing to do. return false; } - buffer.flip(); + ((Buffer)buffer).flip(); int left = buffer.remaining(); while (left > 0) { if (streamReservation == 0) { @@ -913,7 +914,7 @@ class Stream extends AbstractNonZeroStre left -= connectionReservation; } } - buffer.clear(); + ((Buffer)buffer).clear(); return false; } @@ -974,9 +975,9 @@ class Stream extends AbstractNonZeroStre int chunkLimit = src.limit(); while (src.remaining() > 0) { int thisTime = Math.min(buffer.remaining(), src.remaining()); - src.limit(src.position() + thisTime); + ((Buffer)src).limit(src.position() + thisTime); buffer.put(src); - src.limit(chunkLimit); + ((Buffer)src).limit(chunkLimit); if (flush(false, blocking)) { return true; } @@ -1064,14 +1065,14 @@ class Stream extends AbstractNonZeroStre if (inBuffer.position() > 0) { // Data is available in the inBuffer. Copy it to the // outBuffer. - inBuffer.flip(); + ((Buffer)inBuffer).flip(); written = inBuffer.remaining(); if (log.isDebugEnabled()) { log.debug(sm.getString("stream.inputBuffer.copy", Integer.toString(written))); } inBuffer.get(outBuffer, 0, written); - inBuffer.clear(); + ((Buffer)inBuffer).clear(); } else if (!canRead) { return -1; } else { diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/B2CConverter.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/B2CConverter.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/B2CConverter.java 2021-01-28 21:36:28.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/B2CConverter.java 2021-10-18 22:46:03.748843092 +0200 @@ -18,6 +18,7 @@ package org.apache.tomcat.util.buf; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; @@ -107,7 +108,7 @@ public class B2CConverter { */ public void recycle() { decoder.reset(); - leftovers.position(0); + ((Buffer)leftovers).position(0); } /** @@ -126,8 +127,8 @@ public class B2CConverter { bb = ByteBuffer.wrap(bc.getBuffer(), bc.getStart(), bc.getLength()); } else { // Initialize the byte buffer - bb.limit(bc.getEnd()); - bb.position(bc.getStart()); + ((Buffer)bb).limit(bc.getEnd()); + ((Buffer)bb).position(bc.getStart()); } if ((cb == null) || (cb.array() != cc.getBuffer())) { // Create a new char buffer if anything changed @@ -135,8 +136,8 @@ public class B2CConverter { cc.getBuffer().length - cc.getEnd()); } else { // Initialize the char buffer - cb.limit(cc.getBuffer().length); - cb.position(cc.getEnd()); + ((Buffer)cb).limit(cc.getBuffer().length); + ((Buffer)cb).position(cc.getEnd()); } CoderResult result = null; // Parse leftover if any are present @@ -145,16 +146,16 @@ public class B2CConverter { // Loop until one char is decoded or there is a decoder error do { leftovers.put(bc.subtractB()); - leftovers.flip(); + ((Buffer)leftovers).flip(); result = decoder.decode(leftovers, cb, endOfInput); - leftovers.position(leftovers.limit()); - leftovers.limit(leftovers.array().length); + ((Buffer)leftovers).position(leftovers.limit()); + ((Buffer)leftovers).limit(leftovers.array().length); } while (result.isUnderflow() && (cb.position() == pos)); if (result.isError() || result.isMalformed()) { result.throwException(); } - bb.position(bc.getStart()); - leftovers.position(0); + ((Buffer)bb).position(bc.getStart()); + ((Buffer)leftovers).position(0); } // Do the decoding and get the results into the byte chunk and the char // chunk @@ -172,8 +173,8 @@ public class B2CConverter { cc.setEnd(cb.position()); // Put leftovers in the leftovers byte buffer if (bc.getLength() > 0) { - leftovers.limit(leftovers.array().length); - leftovers.position(bc.getLength()); + ((Buffer)leftovers).limit(leftovers.array().length); + ((Buffer)leftovers).position(bc.getLength()); bc.subtract(leftovers.array(), 0, bc.getLength()); } } @@ -196,16 +197,16 @@ public class B2CConverter { bb = ByteBuffer.wrap(bc.array(), bc.arrayOffset() + bc.position(), bc.remaining()); } else { // Initialize the byte buffer - bb.limit(bc.limit()); - bb.position(bc.position()); + ((Buffer)bb).limit(bc.limit()); + ((Buffer)bb).position(bc.position()); } if ((cb == null) || (cb.array() != cc.array())) { // Create a new char buffer if anything changed cb = CharBuffer.wrap(cc.array(), cc.limit(), cc.capacity() - cc.limit()); } else { // Initialize the char buffer - cb.limit(cc.capacity()); - cb.position(cc.limit()); + ((Buffer)cb).limit(cc.capacity()); + ((Buffer)cb).position(cc.limit()); } CoderResult result = null; // Parse leftover if any are present @@ -221,16 +222,16 @@ public class B2CConverter { chr = bc.get(); } leftovers.put(chr); - leftovers.flip(); + ((Buffer)leftovers).flip(); result = decoder.decode(leftovers, cb, endOfInput); - leftovers.position(leftovers.limit()); - leftovers.limit(leftovers.array().length); + ((Buffer)leftovers).position(leftovers.limit()); + ((Buffer)leftovers).limit(leftovers.array().length); } while (result.isUnderflow() && (cb.position() == pos)); if (result.isError() || result.isMalformed()) { result.throwException(); } - bb.position(bc.position()); - leftovers.position(0); + ((Buffer)bb).position(bc.position()); + ((Buffer)leftovers).position(0); } // Do the decoding and get the results into the byte chunk and the char // chunk @@ -240,16 +241,16 @@ public class B2CConverter { } else if (result.isOverflow()) { // Propagate current positions to the byte chunk and char chunk, if // this continues the char buffer will get resized - bc.position(bb.position()); - cc.limit(cb.position()); + ((Buffer)bc).position(bb.position()); + ((Buffer)cc).limit(cb.position()); } else if (result.isUnderflow()) { // Propagate current positions to the byte chunk and char chunk - bc.position(bb.position()); - cc.limit(cb.position()); + ((Buffer)bc).position(bb.position()); + ((Buffer)cc).limit(cb.position()); // Put leftovers in the leftovers byte buffer if (bc.remaining() > 0) { - leftovers.limit(leftovers.array().length); - leftovers.position(bc.remaining()); + ((Buffer)leftovers).limit(leftovers.array().length); + ((Buffer)leftovers).position(bc.remaining()); bc.get(leftovers.array(), 0, bc.remaining()); } } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/ByteBufferHolder.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/ByteBufferHolder.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/ByteBufferHolder.java 2021-01-28 21:36:28.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/ByteBufferHolder.java 2021-10-18 22:46:03.748843092 +0200 @@ -16,6 +16,7 @@ */ package org.apache.tomcat.util.buf; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.concurrent.atomic.AtomicBoolean; @@ -46,7 +47,7 @@ public class ByteBufferHolder { public boolean flip() { if (flipped.compareAndSet(false, true)) { - buf.flip(); + ((Buffer)buf).flip(); return true; } else { return false; diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/ByteBufferUtils.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/ByteBufferUtils.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/ByteBufferUtils.java 2021-01-28 21:36:28.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/ByteBufferUtils.java 2021-10-18 22:46:03.748843092 +0200 @@ -19,6 +19,7 @@ package org.apache.tomcat.util.buf; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.nio.Buffer; import java.nio.ByteBuffer; import org.apache.juli.logging.Log; @@ -108,7 +109,7 @@ public class ByteBufferUtils { } // Copy data - in.flip(); + ((Buffer)in).flip(); out.put(in); if (direct) { diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/ByteChunk.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/ByteChunk.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/ByteChunk.java 2021-01-28 21:36:28.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/ByteChunk.java 2021-10-18 22:46:03.752843108 +0200 @@ -19,6 +19,7 @@ package org.apache.tomcat.util.buf; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; @@ -345,7 +346,7 @@ public final class ByteChunk extends Abs // and avoid an extra copy if (len == limit && end == start && out != null) { out.realWriteBytes(from); - from.position(from.limit()); + ((Buffer)from).position(from.limit()); return; } // if we have limit and we're below @@ -375,13 +376,13 @@ public final class ByteChunk extends Abs int remain = len - avail; avail = limit - end; while (remain >= avail) { - from.limit(from.position() + avail); + ((Buffer)from).limit(from.position() + avail); out.realWriteBytes(from); - from.position(from.limit()); + ((Buffer)from).position(from.limit()); remain = remain - avail; } - from.limit(fromLimit); + ((Buffer)from).limit(fromLimit); from.get(buff, end, remain); end += remain; } @@ -482,8 +483,8 @@ public final class ByteChunk extends Abs } int n = Math.min(to.remaining(), getLength()); to.put(buff, start, n); - to.limit(to.position()); - to.position(to.position() - n); + ((Buffer)to).limit(to.position()); + ((Buffer)to).position(to.position() - n); start += n; return n; } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/C2BConverter.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/C2BConverter.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/C2BConverter.java 2021-01-28 21:36:28.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/C2BConverter.java 2021-10-18 22:46:03.752843108 +0200 @@ -17,6 +17,7 @@ package org.apache.tomcat.util.buf; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; @@ -51,7 +52,7 @@ public final class C2BConverter { */ public void recycle() { encoder.reset(); - leftovers.position(0); + ((Buffer)leftovers).position(0); } public boolean isUndeflow() { @@ -71,16 +72,16 @@ public final class C2BConverter { bb = ByteBuffer.wrap(bc.getBuffer(), bc.getEnd(), bc.getBuffer().length - bc.getEnd()); } else { // Initialize the byte buffer - bb.limit(bc.getBuffer().length); - bb.position(bc.getEnd()); + ((Buffer)bb).limit(bc.getBuffer().length); + ((Buffer)bb).position(bc.getEnd()); } if ((cb == null) || (cb.array() != cc.getBuffer())) { // Create a new char buffer if anything changed cb = CharBuffer.wrap(cc.getBuffer(), cc.getStart(), cc.getLength()); } else { // Initialize the char buffer - cb.limit(cc.getEnd()); - cb.position(cc.getStart()); + ((Buffer)cb).limit(cc.getEnd()); + ((Buffer)cb).position(cc.getStart()); } CoderResult result = null; // Parse leftover if any are present @@ -89,16 +90,16 @@ public final class C2BConverter { // Loop until one char is encoded or there is a encoder error do { leftovers.put((char) cc.subtract()); - leftovers.flip(); + ((Buffer)leftovers).flip(); result = encoder.encode(leftovers, bb, false); - leftovers.position(leftovers.limit()); - leftovers.limit(leftovers.array().length); + ((Buffer)leftovers).position(leftovers.limit()); + ((Buffer)leftovers).limit(leftovers.array().length); } while (result.isUnderflow() && (bb.position() == pos)); if (result.isError() || result.isMalformed()) { result.throwException(); } - cb.position(cc.getStart()); - leftovers.position(0); + ((Buffer)cb).position(cc.getStart()); + ((Buffer)leftovers).position(0); } // Do the decoding and get the results into the byte chunk and the char // chunk @@ -115,8 +116,8 @@ public final class C2BConverter { cc.setOffset(cb.position()); // Put leftovers in the leftovers char buffer if (cc.getLength() > 0) { - leftovers.limit(leftovers.array().length); - leftovers.position(cc.getLength()); + ((Buffer)leftovers).limit(leftovers.array().length); + ((Buffer)leftovers).position(cc.getLength()); cc.subtract(leftovers.array(), 0, cc.getLength()); } } @@ -135,16 +136,16 @@ public final class C2BConverter { bb = ByteBuffer.wrap(bc.array(), bc.limit(), bc.capacity() - bc.limit()); } else { // Initialize the byte buffer - bb.limit(bc.capacity()); - bb.position(bc.limit()); + ((Buffer)bb).limit(bc.capacity()); + ((Buffer)bb).position(bc.limit()); } if ((cb == null) || (cb.array() != cc.array())) { // Create a new char buffer if anything changed cb = CharBuffer.wrap(cc.array(), cc.arrayOffset() + cc.position(), cc.remaining()); } else { // Initialize the char buffer - cb.limit(cc.limit()); - cb.position(cc.position()); + ((Buffer)cb).limit(cc.limit()); + ((Buffer)cb).position(cc.position()); } CoderResult result = null; // Parse leftover if any are present @@ -153,16 +154,16 @@ public final class C2BConverter { // Loop until one char is encoded or there is a encoder error do { leftovers.put(cc.get()); - leftovers.flip(); + ((Buffer)leftovers).flip(); result = encoder.encode(leftovers, bb, false); - leftovers.position(leftovers.limit()); - leftovers.limit(leftovers.array().length); + ((Buffer)leftovers).position(leftovers.limit()); + ((Buffer)leftovers).limit(leftovers.array().length); } while (result.isUnderflow() && (bb.position() == pos)); if (result.isError() || result.isMalformed()) { result.throwException(); } - cb.position(cc.position()); - leftovers.position(0); + ((Buffer)cb).position(cc.position()); + ((Buffer)leftovers).position(0); } // Do the decoding and get the results into the byte chunk and the char // chunk @@ -171,16 +172,16 @@ public final class C2BConverter { result.throwException(); } else if (result.isOverflow()) { // Propagate current positions to the byte chunk and char chunk - bc.limit(bb.position()); - cc.position(cb.position()); + ((Buffer)bc).limit(bb.position()); + ((Buffer)cc).position(cb.position()); } else if (result.isUnderflow()) { // Propagate current positions to the byte chunk and char chunk - bc.limit(bb.position()); - cc.position(cb.position()); + ((Buffer)bc).limit(bb.position()); + ((Buffer)cc).position(cb.position()); // Put leftovers in the leftovers char buffer if (cc.remaining() > 0) { - leftovers.limit(leftovers.array().length); - leftovers.position(cc.remaining()); + ((Buffer)leftovers).limit(leftovers.array().length); + ((Buffer)leftovers).position(cc.remaining()); cc.get(leftovers.array(), 0, cc.remaining()); } } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/Utf8Decoder.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/Utf8Decoder.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/Utf8Decoder.java 2021-01-28 21:36:28.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/Utf8Decoder.java 2021-10-18 22:46:03.752843108 +0200 @@ -16,6 +16,7 @@ */ package org.apache.tomcat.util.buf; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharsetDecoder; @@ -140,7 +141,7 @@ public class Utf8Decoder extends Charset } return CoderResult.UNDERFLOW; } finally { - in.position(pos); + ((Buffer)in).position(pos); } } @@ -163,8 +164,8 @@ public class Utf8Decoder extends Charset // If first byte is invalid, tail will be set to -1 int tail = remainingBytes[jchar]; if (tail == -1) { - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(1); } // Additional checks to detect invalid sequences ASAP @@ -175,72 +176,72 @@ public class Utf8Decoder extends Charset // First byte C2..DF, second byte 80..BF if (jchar > 0x41 && jchar < 0x60 && (bArr[inIndex + 1] & 0xC0) != 0x80) { - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(1); } // First byte E0, second byte A0..BF if (jchar == 0x60 && (bArr[inIndex + 1] & 0xE0) != 0xA0) { - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(1); } // First byte E1..EC, second byte 80..BF if (jchar > 0x60 && jchar < 0x6D && (bArr[inIndex + 1] & 0xC0) != 0x80) { - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(1); } // First byte ED, second byte 80..9F if (jchar == 0x6D && (bArr[inIndex + 1] & 0xE0) != 0x80) { - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(1); } // First byte EE..EF, second byte 80..BF if (jchar > 0x6D && jchar < 0x70 && (bArr[inIndex + 1] & 0xC0) != 0x80) { - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(1); } // First byte F0, second byte 90..BF if (jchar == 0x70 && ((bArr[inIndex + 1] & 0xFF) < 0x90 || (bArr[inIndex + 1] & 0xFF) > 0xBF)) { - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(1); } // First byte F1..F3, second byte 80..BF if (jchar > 0x70 && jchar < 0x74 && (bArr[inIndex + 1] & 0xC0) != 0x80) { - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(1); } // First byte F4, second byte 80..8F if (jchar == 0x74 && (bArr[inIndex + 1] & 0xF0) != 0x80) { - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(1); } } // Check third byte if present and expected if (tailAvailable > 1 && tail > 1) { if ((bArr[inIndex + 2] & 0xC0) != 0x80) { - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(2); } } // Check fourth byte if present and expected if (tailAvailable > 2 && tail > 2) { if ((bArr[inIndex + 3] & 0xC0) != 0x80) { - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(3); } } @@ -250,8 +251,8 @@ public class Utf8Decoder extends Charset for (int i = 0; i < tail; i++) { int nextByte = bArr[inIndex + i + 1] & 0xFF; if ((nextByte & 0xC0) != 0x80) { - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(1 + i); } jchar = (jchar << 6) + nextByte; @@ -259,8 +260,8 @@ public class Utf8Decoder extends Charset jchar -= remainingNumbers[tail]; if (jchar < lowerEncodingLimit[tail]) { // Should have been encoded in fewer octets - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.malformedForLength(1); } inIndex += tail; @@ -281,8 +282,8 @@ public class Utf8Decoder extends Charset // Encoded with 4 bytes. inIndex currently points // to the final byte. Move it back to first byte. inIndex -= 3; - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return CoderResult.OVERFLOW; } cArr[outIndex++] = (char) ((jchar >> 0xA) + 0xD7C0); @@ -290,8 +291,8 @@ public class Utf8Decoder extends Charset outRemaining -= 2; } } - in.position(inIndex - in.arrayOffset()); - out.position(outIndex - out.arrayOffset()); + ((Buffer)in).position(inIndex - in.arrayOffset()); + ((Buffer)out).position(outIndex - out.arrayOffset()); return (outRemaining == 0 && inIndex < inIndexLimit) ? CoderResult.OVERFLOW : CoderResult.UNDERFLOW; diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/Utf8Encoder.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/Utf8Encoder.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/buf/Utf8Encoder.java 2021-01-28 21:36:28.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/buf/Utf8Encoder.java 2021-10-18 22:46:03.752843108 +0200 @@ -16,6 +16,7 @@ */ package org.apache.tomcat.util.buf; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharsetEncoder; @@ -56,8 +57,8 @@ public class Utf8Encoder extends Charset if (jchar <= 0x7F) { if (outRemaining < 1) { - in.position(x); - out.position(outPos); + ((Buffer)in).position(x); + ((Buffer)out).position(outPos); return CoderResult.OVERFLOW; } bArr[outPos++] = (byte) (jchar & 0xFF); @@ -65,8 +66,8 @@ public class Utf8Encoder extends Charset } else if (jchar <= 0x7FF) { if (outRemaining < 2) { - in.position(x); - out.position(outPos); + ((Buffer)in).position(x); + ((Buffer)out).position(outPos); return CoderResult.OVERFLOW; } bArr[outPos++] = (byte) (0xC0 + ((jchar >> 6) & 0x1F)); @@ -77,21 +78,21 @@ public class Utf8Encoder extends Charset // in has to have one byte more. if (limit <= x + 1) { - in.position(x); - out.position(outPos); + ((Buffer)in).position(x); + ((Buffer)out).position(outPos); return CoderResult.UNDERFLOW; } if (outRemaining < 4) { - in.position(x); - out.position(outPos); + ((Buffer)in).position(x); + ((Buffer)out).position(outPos); return CoderResult.OVERFLOW; } // The surrogate pair starts with a low-surrogate. if (jchar >= 0xDC00) { - in.position(x); - out.position(outPos); + ((Buffer)in).position(x); + ((Buffer)out).position(outPos); return CoderResult.malformedForLength(1); } @@ -99,8 +100,8 @@ public class Utf8Encoder extends Charset // The surrogate pair ends with a high-surrogate. if (jchar2 < 0xDC00) { - in.position(x); - out.position(outPos); + ((Buffer)in).position(x); + ((Buffer)out).position(outPos); return CoderResult.malformedForLength(1); } @@ -121,8 +122,8 @@ public class Utf8Encoder extends Charset } else { if (outRemaining < 3) { - in.position(x); - out.position(outPos); + ((Buffer)in).position(x); + ((Buffer)out).position(outPos); return CoderResult.OVERFLOW; } bArr[outPos++] = (byte) (0xE0 + ((jchar >> 12) & 0x0F)); @@ -131,8 +132,8 @@ public class Utf8Encoder extends Charset outRemaining -= 3; } if (outRemaining == 0) { - in.position(x + 1); - out.position(outPos); + ((Buffer)in).position(x + 1); + ((Buffer)out).position(outPos); // If both input and output are exhausted, return UNDERFLOW if (x + 1 == limit) { return CoderResult.UNDERFLOW; @@ -143,8 +144,8 @@ public class Utf8Encoder extends Charset } if (rem != 0) { - in.position(x); - out.position(outPos); + ((Buffer)in).position(x); + ((Buffer)out).position(outPos); } return CoderResult.UNDERFLOW; } @@ -228,7 +229,7 @@ public class Utf8Encoder extends Charset pos++; } } finally { - in.position(pos); + ((Buffer)in).position(pos); } return CoderResult.UNDERFLOW; } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/AprEndpoint.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/AprEndpoint.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/AprEndpoint.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/AprEndpoint.java 2021-10-18 22:46:03.752843108 +0200 @@ -20,6 +20,7 @@ import java.io.EOFException; import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketTimeoutException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.CompletionHandler; import java.nio.charset.StandardCharsets; @@ -2033,7 +2034,7 @@ public class AprEndpoint extends Abstrac // SSL and app buffer size settings with NIO & NIO2. if (endpoint.isSSLEnabled()) { sslOutputBuffer = ByteBuffer.allocateDirect(SSL_OUTPUT_BUFFER_SIZE); - sslOutputBuffer.position(SSL_OUTPUT_BUFFER_SIZE); + ((Buffer)sslOutputBuffer).position(SSL_OUTPUT_BUFFER_SIZE); } else { sslOutputBuffer = null; } @@ -2095,7 +2096,7 @@ public class AprEndpoint extends Abstrac // The socket read buffer capacity is socket.appReadBufSize int limit = socketBufferHandler.getReadBuffer().capacity(); if (to.isDirect() && to.remaining() >= limit) { - to.limit(to.position() + limit); + ((Buffer)to).limit(to.position() + limit); nRead = fillReadBuffer(block, to); if (log.isDebugEnabled()) { log.debug("Socket: [" + this + "], Read direct from socket: [" + nRead + "]"); @@ -2174,7 +2175,7 @@ public class AprEndpoint extends Abstrac } if (result > 0) { - to.position(to.position() + result); + ((Buffer)to).position(to.position() + result); return result; } else if (result == 0 || -result == Status.EAGAIN) { return 0; @@ -2297,9 +2298,9 @@ public class AprEndpoint extends Abstrac if (getEndpoint().isSSLEnabled()) { if (sslOutputBuffer.remaining() == 0) { // Buffer was fully written last time around - sslOutputBuffer.clear(); + ((Buffer)sslOutputBuffer).clear(); transfer(from, sslOutputBuffer); - sslOutputBuffer.flip(); + ((Buffer)sslOutputBuffer).flip(); } else { // Buffer still has data from previous attempt to write // APR + SSL requires that exactly the same parameters are @@ -2308,13 +2309,13 @@ public class AprEndpoint extends Abstrac thisTime = Socket.sendb(getSocket().longValue(), sslOutputBuffer, sslOutputBuffer.position(), sslOutputBuffer.limit()); if (thisTime > 0) { - sslOutputBuffer.position(sslOutputBuffer.position() + thisTime); + ((Buffer)sslOutputBuffer).position(sslOutputBuffer.position() + thisTime); } } else { thisTime = Socket.sendb(getSocket().longValue(), from, from.position(), from.remaining()); if (thisTime > 0) { - from.position(from.position() + thisTime); + ((Buffer)from).position(from.position() + thisTime); } } if (Status.APR_STATUS_IS_EAGAIN(-thisTime)) { diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/Nio2Endpoint.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/Nio2Endpoint.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/Nio2Endpoint.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/Nio2Endpoint.java 2021-10-18 22:46:03.752843108 +0200 @@ -22,6 +22,7 @@ import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.SocketTimeoutException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousChannelGroup; import java.nio.channels.AsynchronousCloseException; @@ -555,7 +556,7 @@ public class Nio2Endpoint extends Abstra if (nRead > 0) { getSocket().getBufHandler().configureWriteBufferForRead(); if (attachment.length < buffer.remaining()) { - buffer.limit(buffer.limit() - buffer.remaining() + (int) attachment.length); + ((Buffer)buffer).limit(buffer.limit() - buffer.remaining() + (int) attachment.length); } attachment.length -= nRead; } else { @@ -900,7 +901,7 @@ public class Nio2Endpoint extends Abstra // The socket read buffer capacity is socket.appReadBufSize int limit = socketBufferHandler.getReadBuffer().capacity(); if (block && to.remaining() >= limit) { - to.limit(to.position() + limit); + ((Buffer)to).limit(to.position() + limit); nRead = fillReadBuffer(block, to); if (log.isDebugEnabled()) { log.debug("Socket: [" + this + "], Read direct from socket: [" + nRead + "]"); diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/NioEndpoint.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/NioEndpoint.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/NioEndpoint.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/NioEndpoint.java 2021-10-18 22:46:03.752843108 +0200 @@ -24,6 +24,7 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.SocketTimeoutException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.CancelledKeyException; import java.nio.channels.Channel; @@ -1228,7 +1229,7 @@ public class NioEndpoint extends Abstrac // The socket read buffer capacity is socket.appReadBufSize int limit = socketBufferHandler.getReadBuffer().capacity(); if (to.remaining() >= limit) { - to.limit(to.position() + limit); + ((Buffer)to).limit(to.position() + limit); nRead = fillReadBuffer(block, to); if (log.isDebugEnabled()) { log.debug("Socket: [" + this + "], Read direct from socket: [" + nRead + "]"); diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java 2021-10-18 22:46:03.752843108 +0200 @@ -16,6 +16,7 @@ */ package org.apache.tomcat.util.net.openssl; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ReadOnlyBufferException; import java.security.Principal; @@ -40,7 +41,7 @@ import javax.net.ssl.SSLSessionContext; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; -import org.apache.tomcat.jni.Buffer; +// import org.apache.tomcat.jni.Buffer; import org.apache.tomcat.jni.Pool; import org.apache.tomcat.jni.SSL; import org.apache.tomcat.jni.SSLContext; @@ -130,7 +131,7 @@ public final class OpenSSLEngine extends private static final String INVALID_CIPHER = "SSL_NULL_WITH_NULL_NULL"; - private static final long EMPTY_ADDR = Buffer.address(ByteBuffer.allocate(0)); + private static final long EMPTY_ADDR = org.apache.tomcat.jni.Buffer.address(ByteBuffer.allocate(0)); // OpenSSL state private final long ssl; @@ -242,10 +243,10 @@ public final class OpenSSLEngine extends final int sslWrote; if (src.isDirect()) { - final long addr = Buffer.address(src) + pos; + final long addr = org.apache.tomcat.jni.Buffer.address(src) + pos; sslWrote = SSL.writeToSSL(ssl, addr, len); if (sslWrote >= 0) { - src.position(pos + sslWrote); + ((Buffer)src).position(pos + sslWrote); return sslWrote; } } else { @@ -253,17 +254,17 @@ public final class OpenSSLEngine extends try { final long addr = memoryAddress(buf); - src.limit(pos + len); + ((Buffer)src).limit(pos + len); buf.put(src); - src.limit(limit); + ((Buffer)src).limit(limit); sslWrote = SSL.writeToSSL(ssl, addr, len); if (sslWrote >= 0) { - src.position(pos + sslWrote); + ((Buffer)src).position(pos + sslWrote); return sslWrote; } else { - src.position(pos); + ((Buffer)src).position(pos); } } finally { buf.clear(); @@ -282,10 +283,10 @@ public final class OpenSSLEngine extends final int pos = src.position(); final int len = src.remaining(); if (src.isDirect()) { - final long addr = Buffer.address(src) + pos; + final long addr = org.apache.tomcat.jni.Buffer.address(src) + pos; final int netWrote = SSL.writeToBIO(networkBIO, addr, len); if (netWrote >= 0) { - src.position(pos + netWrote); + ((Buffer)src).position(pos + netWrote); return netWrote; } } else { @@ -297,10 +298,10 @@ public final class OpenSSLEngine extends final int netWrote = SSL.writeToBIO(networkBIO, addr, len); if (netWrote >= 0) { - src.position(pos + netWrote); + ((Buffer)src).position(pos + netWrote); return netWrote; } else { - src.position(pos); + ((Buffer)src).position(pos); } } finally { buf.clear(); @@ -317,11 +318,11 @@ public final class OpenSSLEngine extends private static int readPlaintextData(final long ssl, final ByteBuffer dst) { if (dst.isDirect()) { final int pos = dst.position(); - final long addr = Buffer.address(dst) + pos; + final long addr = org.apache.tomcat.jni.Buffer.address(dst) + pos; final int len = dst.limit() - pos; final int sslRead = SSL.readFromSSL(ssl, addr, len); if (sslRead > 0) { - dst.position(pos + sslRead); + ((Buffer)dst).position(pos + sslRead); return sslRead; } } else { @@ -335,9 +336,9 @@ public final class OpenSSLEngine extends final int sslRead = SSL.readFromSSL(ssl, addr, len); if (sslRead > 0) { buf.limit(sslRead); - dst.limit(pos + sslRead); + ((Buffer)dst).limit(pos + sslRead); dst.put(buf); - dst.limit(limit); + ((Buffer)dst).limit(limit); return sslRead; } } finally { @@ -355,10 +356,10 @@ public final class OpenSSLEngine extends private static int readEncryptedData(final long networkBIO, final ByteBuffer dst, final int pending) { if (dst.isDirect() && dst.remaining() >= pending) { final int pos = dst.position(); - final long addr = Buffer.address(dst) + pos; + final long addr = org.apache.tomcat.jni.Buffer.address(dst) + pos; final int bioRead = SSL.readFromBIO(networkBIO, addr, pending); if (bioRead > 0) { - dst.position(pos + bioRead); + ((Buffer)dst).position(pos + bioRead); return bioRead; } } else { @@ -370,9 +371,9 @@ public final class OpenSSLEngine extends if (bioRead > 0) { buf.limit(bioRead); int oldLimit = dst.limit(); - dst.limit(dst.position() + bioRead); + ((Buffer)dst).limit(dst.position() + bioRead); dst.put(buf); - dst.limit(oldLimit); + ((Buffer)dst).limit(oldLimit); return bioRead; } } finally { @@ -968,7 +969,7 @@ public final class OpenSSLEngine extends private static long memoryAddress(ByteBuffer buf) { - return Buffer.address(buf); + return org.apache.tomcat.jni.Buffer.address(buf); } private SSLEngineResult.Status getEngineStatus() { diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/SecureNio2Channel.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/SecureNio2Channel.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/SecureNio2Channel.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/SecureNio2Channel.java 2021-10-18 22:46:03.756843123 +0200 @@ -18,6 +18,7 @@ package org.apache.tomcat.util.net; import java.io.EOFException; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; @@ -138,7 +139,7 @@ public class SecureNio2Channel extends N unwrapBeforeRead = true; closed = false; closing = false; - netInBuffer.clear(); + ((Buffer)netInBuffer).clear(); } @Override @@ -328,7 +329,7 @@ public class SecureNio2Channel extends N } else if (handshake.getStatus() == Status.BUFFER_UNDERFLOW) { if (netInBuffer.position() == netInBuffer.limit()) { //clear the buffer if we have emptied it out on data - netInBuffer.clear(); + ((Buffer)netInBuffer).clear(); } //read more data if (async) { @@ -423,9 +424,9 @@ public class SecureNio2Channel extends N clientRequestedCiphers = Collections.emptyList(); break; case NON_SECURE: - netOutBuffer.clear(); + ((Buffer)netOutBuffer).clear(); netOutBuffer.put(TLSClientHelloExtractor.USE_TLS_RESPONSE); - netOutBuffer.flip(); + ((Buffer)netOutBuffer).flip(); flush(); throw new IOException(sm.getString("channel.nio.ssl.foundHttp")); } @@ -456,8 +457,8 @@ public class SecureNio2Channel extends N netOutBuffer = ByteBufferUtils.expand(netOutBuffer, sslEngine.getSession().getPacketBufferSize()); // Set limit and position to expected values - netOutBuffer.position(0); - netOutBuffer.limit(0); + ((Buffer)netOutBuffer).position(0); + ((Buffer)netOutBuffer).limit(0); // Initiate handshake sslEngine.beginHandshake(); @@ -481,10 +482,10 @@ public class SecureNio2Channel extends N if (!getBufHandler().isReadBufferEmpty()) throw new IOException(sm.getString("channel.nio.ssl.appInputNotEmpty")); if (!getBufHandler().isWriteBufferEmpty()) throw new IOException(sm.getString("channel.nio.ssl.appOutputNotEmpty")); - netOutBuffer.position(0); - netOutBuffer.limit(0); - netInBuffer.position(0); - netInBuffer.limit(0); + ((Buffer)netOutBuffer).position(0); + ((Buffer)netOutBuffer).limit(0); + ((Buffer)netInBuffer).position(0); + ((Buffer)netInBuffer).limit(0); getBufHandler().reset(); handshakeComplete = false; @@ -533,12 +534,12 @@ public class SecureNio2Channel extends N protected SSLEngineResult handshakeWrap() throws IOException { //this should never be called with a network buffer that contains data //so we can clear it here. - netOutBuffer.clear(); + ((Buffer)netOutBuffer).clear(); //perform the wrap getBufHandler().configureWriteBufferForRead(); SSLEngineResult result = sslEngine.wrap(getBufHandler().getWriteBuffer(), netOutBuffer); //prepare the results to be written - netOutBuffer.flip(); + ((Buffer)netOutBuffer).flip(); //set the status handshakeStatus = result.getHandshakeStatus(); return result; @@ -555,7 +556,7 @@ public class SecureNio2Channel extends N //loop while we can perform pure SSLEngine data do { //prepare the buffer with the incoming data - netInBuffer.flip(); + ((Buffer)netInBuffer).flip(); //call unwrap getBufHandler().configureReadBufferForWrite(); result = sslEngine.unwrap(netInBuffer, getBufHandler().getReadBuffer()); @@ -621,7 +622,7 @@ public class SecureNio2Channel extends N throw new IOException(sm.getString("channel.nio.ssl.pendingWriteDuringClose"), e); } //prep the buffer for the close message - netOutBuffer.clear(); + ((Buffer)netOutBuffer).clear(); //perform the close, since we called sslEngine.closeOutbound SSLEngineResult handshake = sslEngine.wrap(getEmptyBuf(), netOutBuffer); //we should be in a close state @@ -629,7 +630,7 @@ public class SecureNio2Channel extends N throw new IOException(sm.getString("channel.nio.ssl.invalidCloseState")); } //prepare the buffer for writing - netOutBuffer.flip(); + ((Buffer)netOutBuffer).flip(); //if there is data to be written try { if (timeout > 0) { @@ -731,7 +732,7 @@ public class SecureNio2Channel extends N SSLEngineResult unwrap; do { //prepare the buffer - netInBuffer.flip(); + ((Buffer)netInBuffer).flip(); //unwrap the data try { unwrap = sslEngine.unwrap(netInBuffer, dst); @@ -874,10 +875,10 @@ public class SecureNio2Channel extends N protected void wrap() { try { if (!netOutBuffer.hasRemaining()) { - netOutBuffer.clear(); + ((Buffer)netOutBuffer).clear(); SSLEngineResult result = sslEngine.wrap(src, netOutBuffer); written = result.bytesConsumed(); - netOutBuffer.flip(); + ((Buffer)netOutBuffer).flip(); if (result.getStatus() == Status.OK) { if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) tasks(); @@ -929,7 +930,7 @@ public class SecureNio2Channel extends N SSLEngineResult unwrap; do { //prepare the buffer - netInBuffer.flip(); + ((Buffer)netInBuffer).flip(); //unwrap the data unwrap = sslEngine.unwrap(netInBuffer, dst2); //compact the buffer @@ -1037,7 +1038,7 @@ public class SecureNio2Channel extends N overflowState = OverflowState.DONE; } //prepare the buffer - netInBuffer.flip(); + ((Buffer)netInBuffer).flip(); //unwrap the data unwrap = sslEngine.unwrap(netInBuffer, dsts2, offset, length2); //compact the buffer @@ -1157,11 +1158,11 @@ public class SecureNio2Channel extends N } try { // Prepare the output buffer - netOutBuffer.clear(); + ((Buffer)netOutBuffer).clear(); // Wrap the source data into the internal buffer SSLEngineResult result = sslEngine.wrap(src, netOutBuffer); final int written = result.bytesConsumed(); - netOutBuffer.flip(); + ((Buffer)netOutBuffer).flip(); if (result.getStatus() == Status.OK) { if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) { tasks(); @@ -1211,11 +1212,11 @@ public class SecureNio2Channel extends N } try { // Prepare the output buffer - netOutBuffer.clear(); + ((Buffer)netOutBuffer).clear(); // Wrap the source data into the internal buffer SSLEngineResult result = sslEngine.wrap(srcs, offset, length, netOutBuffer); final int written = result.bytesConsumed(); - netOutBuffer.flip(); + ((Buffer)netOutBuffer).flip(); if (result.getStatus() == Status.OK) { if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) { tasks(); diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/SecureNioChannel.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/SecureNioChannel.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/SecureNioChannel.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/SecureNioChannel.java 2021-10-18 22:46:03.756843123 +0200 @@ -19,6 +19,7 @@ package org.apache.tomcat.util.net; import java.io.EOFException; import java.io.IOException; import java.net.SocketTimeoutException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; @@ -100,7 +101,7 @@ public class SecureNioChannel extends Ni handshakeComplete = false; closed = false; closing = false; - netInBuffer.clear(); + ((Buffer)netInBuffer).clear(); } @Override @@ -320,9 +321,9 @@ public class SecureNioChannel extends Ni clientRequestedCiphers = Collections.emptyList(); break; case NON_SECURE: - netOutBuffer.clear(); + ((Buffer)netOutBuffer).clear(); netOutBuffer.put(TLSClientHelloExtractor.USE_TLS_RESPONSE); - netOutBuffer.flip(); + ((Buffer)netOutBuffer).flip(); flushOutbound(); throw new IOException(sm.getString("channel.nio.ssl.foundHttp")); } @@ -353,8 +354,8 @@ public class SecureNioChannel extends Ni netOutBuffer = ByteBufferUtils.expand(netOutBuffer, sslEngine.getSession().getPacketBufferSize()); // Set limit and position to expected values - netOutBuffer.position(0); - netOutBuffer.limit(0); + ((Buffer)netOutBuffer).position(0); + ((Buffer)netOutBuffer).limit(0); // Initiate handshake sslEngine.beginHandshake(); @@ -466,12 +467,12 @@ public class SecureNioChannel extends Ni protected SSLEngineResult handshakeWrap(boolean doWrite) throws IOException { //this should never be called with a network buffer that contains data //so we can clear it here. - netOutBuffer.clear(); + ((Buffer)netOutBuffer).clear(); //perform the wrap getBufHandler().configureWriteBufferForRead(); SSLEngineResult result = sslEngine.wrap(getBufHandler().getWriteBuffer(), netOutBuffer); //prepare the results to be written - netOutBuffer.flip(); + ((Buffer)netOutBuffer).flip(); //set the status handshakeStatus = result.getHandshakeStatus(); //optimization, if we do have a writable channel, write it now @@ -491,7 +492,7 @@ public class SecureNioChannel extends Ni if (netInBuffer.position() == netInBuffer.limit()) { //clear the buffer if we have emptied it out on data - netInBuffer.clear(); + ((Buffer)netInBuffer).clear(); } if (doread) { //if we have data to read, read it @@ -505,7 +506,7 @@ public class SecureNioChannel extends Ni //loop while we can perform pure SSLEngine data do { //prepare the buffer with the incoming data - netInBuffer.flip(); + ((Buffer)netInBuffer).flip(); //call unwrap getBufHandler().configureReadBufferForWrite(); result = sslEngine.unwrap(netInBuffer, getBufHandler().getReadBuffer()); @@ -557,7 +558,7 @@ public class SecureNioChannel extends Ni throw new IOException(sm.getString("channel.nio.ssl.remainingDataDuringClose")); } //prep the buffer for the close message - netOutBuffer.clear(); + ((Buffer)netOutBuffer).clear(); //perform the close, since we called sslEngine.closeOutbound SSLEngineResult handshake = sslEngine.wrap(getEmptyBuf(), netOutBuffer); //we should be in a close state @@ -565,7 +566,7 @@ public class SecureNioChannel extends Ni throw new IOException(sm.getString("channel.nio.ssl.invalidCloseState")); } //prepare the buffer for writing - netOutBuffer.flip(); + ((Buffer)netOutBuffer).flip(); //if there is data to be written flush(netOutBuffer); @@ -632,7 +633,7 @@ public class SecureNioChannel extends Ni SSLEngineResult unwrap; do { //prepare the buffer - netInBuffer.flip(); + ((Buffer)netInBuffer).flip(); //unwrap the data unwrap = sslEngine.unwrap(netInBuffer, dst); //compact the buffer @@ -709,7 +710,7 @@ public class SecureNioChannel extends Ni overflowState = OverflowState.DONE; } //prepare the buffer - netInBuffer.flip(); + ((Buffer)netInBuffer).flip(); //unwrap the data unwrap = sslEngine.unwrap(netInBuffer, dsts, offset, length); //compact the buffer @@ -817,12 +818,12 @@ public class SecureNioChannel extends Ni } // The data buffer is empty, we can reuse the entire buffer. - netOutBuffer.clear(); + ((Buffer)netOutBuffer).clear(); SSLEngineResult result = sslEngine.wrap(src, netOutBuffer); // The number of bytes written int written = result.bytesConsumed(); - netOutBuffer.flip(); + ((Buffer)netOutBuffer).flip(); if (result.getStatus() == Status.OK) { if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) { @@ -854,12 +855,12 @@ public class SecureNioChannel extends Ni } // The data buffer is empty, we can reuse the entire buffer. - netOutBuffer.clear(); + ((Buffer)netOutBuffer).clear(); SSLEngineResult result = sslEngine.wrap(srcs, offset, length, netOutBuffer); // The number of bytes written int written = result.bytesConsumed(); - netOutBuffer.flip(); + ((Buffer)netOutBuffer).flip(); if (result.getStatus() == Status.OK) { if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) tasks(); diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/SocketBufferHandler.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/SocketBufferHandler.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/SocketBufferHandler.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/SocketBufferHandler.java 2021-10-18 22:46:03.756843123 +0200 @@ -17,6 +17,7 @@ package org.apache.tomcat.util.net; import java.nio.BufferOverflowException; +import java.nio.Buffer; import java.nio.ByteBuffer; import org.apache.tomcat.util.buf.ByteBufferUtils; @@ -78,13 +79,13 @@ public class SocketBufferHandler { // Switching to write int remaining = readBuffer.remaining(); if (remaining == 0) { - readBuffer.clear(); + ((Buffer)readBuffer).clear(); } else { readBuffer.compact(); } } else { // Switching to read - readBuffer.flip(); + ((Buffer)readBuffer).flip(); } this.readBufferConfiguredForWrite = readBufferConFiguredForWrite; } @@ -171,15 +172,15 @@ public class SocketBufferHandler { // Switching to write int remaining = writeBuffer.remaining(); if (remaining == 0) { - writeBuffer.clear(); + ((Buffer)writeBuffer).clear(); } else { writeBuffer.compact(); - writeBuffer.position(remaining); - writeBuffer.limit(writeBuffer.capacity()); + ((Buffer)writeBuffer).position(remaining); + ((Buffer)writeBuffer).limit(writeBuffer.capacity()); } } else { // Switching to read - writeBuffer.flip(); + ((Buffer)writeBuffer).flip(); } this.writeBufferConfiguredForWrite = writeBufferConfiguredForWrite; } @@ -210,9 +211,9 @@ public class SocketBufferHandler { public void reset() { - readBuffer.clear(); + ((Buffer)readBuffer).clear(); readBufferConfiguredForWrite = true; - writeBuffer.clear(); + ((Buffer)writeBuffer).clear(); writeBufferConfiguredForWrite = true; } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/SocketWrapperBase.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/SocketWrapperBase.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/SocketWrapperBase.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/SocketWrapperBase.java 2021-10-18 22:46:03.756843123 +0200 @@ -19,6 +19,7 @@ package org.apache.tomcat.util.net; import java.io.EOFException; import java.io.IOException; import java.net.SocketTimeoutException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.CompletionHandler; import java.nio.channels.InterruptedByTimeoutException; @@ -1502,9 +1503,9 @@ public abstract class SocketWrapperBase< int max = Math.min(from.remaining(), to.remaining()); if (max > 0) { int fromLimit = from.limit(); - from.limit(from.position() + max); + ((Buffer)from).limit(from.position() + max); to.put(from); - from.limit(fromLimit); + ((Buffer)from).limit(fromLimit); } return max; } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java 2021-10-18 22:46:03.756843123 +0200 @@ -17,6 +17,7 @@ package org.apache.tomcat.util.net; import java.io.IOException; +import java.nio.Buffer; import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; @@ -83,7 +84,7 @@ public class TLSClientHelloExtractor { String sniValue = null; try { // Switch to read mode. - netInBuffer.flip(); + ((Buffer)netInBuffer).flip(); // A complete TLS record header is required before we can figure out // how many bytes there are in the record. @@ -186,8 +187,8 @@ public class TLSClientHelloExtractor { this.sniValue = sniValue; this.clientRequestedProtocols = clientRequestedProtocols; // Whatever happens, return the buffer to its original state - netInBuffer.limit(limit); - netInBuffer.position(pos); + ((Buffer)netInBuffer).limit(limit); + ((Buffer)netInBuffer).position(pos); } } @@ -259,7 +260,7 @@ public class TLSClientHelloExtractor { private static boolean isAvailable(ByteBuffer bb, int size) { if (bb.remaining() < size) { - bb.position(bb.limit()); + ((Buffer)bb).position(bb.limit()); return false; } return true; @@ -287,7 +288,7 @@ public class TLSClientHelloExtractor { // the buffer contains a correctly formatted HTTP request line. // The method, target and protocol are not validated. byte chr = 0; - bb.position(0); + ((Buffer)bb).position(0); // Skip blank lines do { @@ -368,7 +369,7 @@ public class TLSClientHelloExtractor { private static void skipBytes(ByteBuffer bb, int size) { - bb.position(bb.position() + size); + ((Buffer)bb).position(bb.position() + size); } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/WriteBuffer.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/WriteBuffer.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/WriteBuffer.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/WriteBuffer.java 2021-10-18 22:46:03.756843123 +0200 @@ -17,6 +17,7 @@ package org.apache.tomcat.util.net; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Iterator; diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java 2021-10-18 22:46:03.756843123 +0200 @@ -19,6 +19,7 @@ package org.apache.tomcat.websocket; import java.io.EOFException; import java.io.IOException; import java.net.SocketAddress; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; @@ -196,7 +197,7 @@ public class AsyncChannelWrapperSecure i for (int i = offset; i < offset + length; i++) { ByteBuffer src = srcs[i]; while (src.hasRemaining()) { - socketWriteBuffer.clear(); + ((Buffer)socketWriteBuffer).clear(); // Encrypt the data SSLEngineResult r = sslEngine.wrap(src, socketWriteBuffer); @@ -222,7 +223,7 @@ public class AsyncChannelWrapperSecure i } } - socketWriteBuffer.flip(); + ((Buffer)socketWriteBuffer).flip(); // Do the write int toWrite = r.bytesProduced(); @@ -279,7 +280,7 @@ public class AsyncChannelWrapperSecure i } } - socketReadBuffer.flip(); + ((Buffer)socketReadBuffer).flip(); if (socketReadBuffer.hasRemaining()) { // Decrypt the data in the buffer @@ -365,7 +366,7 @@ public class AsyncChannelWrapperSecure i try { sslEngine.beginHandshake(); // So the first compact does the right thing - socketReadBuffer.position(socketReadBuffer.limit()); + ((Buffer)socketReadBuffer).position(socketReadBuffer.limit()); handshakeStatus = sslEngine.getHandshakeStatus(); resultStatus = Status.OK; @@ -375,11 +376,11 @@ public class AsyncChannelWrapperSecure i while(handshaking) { switch (handshakeStatus) { case NEED_WRAP: { - socketWriteBuffer.clear(); + ((Buffer)socketWriteBuffer).clear(); SSLEngineResult r = sslEngine.wrap(DUMMY, socketWriteBuffer); checkResult(r, true); - socketWriteBuffer.flip(); + ((Buffer)socketWriteBuffer).flip(); Future fWrite = socketChannel.write(socketWriteBuffer); fWrite.get(); @@ -393,7 +394,7 @@ public class AsyncChannelWrapperSecure i socketChannel.read(socketReadBuffer); fRead.get(); } - socketReadBuffer.flip(); + ((Buffer)socketReadBuffer).flip(); SSLEngineResult r = sslEngine.unwrap(socketReadBuffer, DUMMY); checkResult(r, false); diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/PerMessageDeflate.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/PerMessageDeflate.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/PerMessageDeflate.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/PerMessageDeflate.java 2021-10-18 22:46:03.756843123 +0200 @@ -17,6 +17,7 @@ package org.apache.tomcat.websocket; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; @@ -207,11 +208,11 @@ public class PerMessageDeflate implement } catch (NullPointerException e) { throw new IOException(sm.getString("perMessageDeflate.alreadyClosed"), e); } - dest.position(dest.position() + written); + ((Buffer)dest).position(dest.position() + written); if (inflater.needsInput() && !usedEomBytes ) { if (dest.hasRemaining()) { - readBuffer.clear(); + ((Buffer)readBuffer).clear(); TransformationResult nextResult = next.getMoreData(opCode, fin, (rsv ^ RSV_BITMASK), readBuffer); inflater.setInput( @@ -355,7 +356,7 @@ public class PerMessageDeflate implement int written = deflater.deflate(compressedPayload.array(), compressedPayload.arrayOffset() + compressedPayload.position(), compressedPayload.remaining(), flush); - compressedPayload.position(compressedPayload.position() + written); + ((Buffer)compressedPayload).position(compressedPayload.position() + written); } catch (NullPointerException e) { throw new IOException(sm.getString("perMessageDeflate.alreadyClosed"), e); } @@ -375,7 +376,7 @@ public class PerMessageDeflate implement writeBuffer = ByteBuffer.allocate(Constants.DEFAULT_BUFFER_SIZE); // Flip the compressed payload ready for writing - compressedPayload.flip(); + ((Buffer)compressedPayload).flip(); boolean fin = uncompressedPart.isFin(); boolean full = compressedPayload.limit() == compressedPayload.capacity(); @@ -384,7 +385,7 @@ public class PerMessageDeflate implement if (fin && !full && needsInput) { // End of compressed message. Drop EOM bytes and output. - compressedPayload.limit(compressedPayload.limit() - EOM_BYTES.length); + ((Buffer)compressedPayload).limit(compressedPayload.limit() - EOM_BYTES.length); compressedPart = new MessagePart(true, getRsv(uncompressedPart), opCode, compressedPayload, uncompressedIntermediateHandler, uncompressedIntermediateHandler, blockingWriteTimeoutExpiry); @@ -419,7 +420,7 @@ public class PerMessageDeflate implement } if (eomBufferWritten < EOM_BUFFER.length) { // EOM has just been completed - compressedPayload.limit(compressedPayload.limit() - EOM_BYTES.length + eomBufferWritten); + ((Buffer)compressedPayload).limit(compressedPayload.limit() - EOM_BYTES.length + eomBufferWritten); compressedPart = new MessagePart(true, getRsv(uncompressedPart), opCode, compressedPayload, uncompressedIntermediateHandler, uncompressedIntermediateHandler, diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/server/WsFrameServer.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/server/WsFrameServer.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/server/WsFrameServer.java 2021-01-28 21:36:31.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/server/WsFrameServer.java 2021-10-18 22:46:03.756843123 +0200 @@ -19,6 +19,7 @@ package org.apache.tomcat.websocket.serv import java.io.EOFException; import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.Buffer; import org.apache.coyote.http11.upgrade.UpgradeInfo; import org.apache.juli.logging.Log; @@ -70,10 +71,10 @@ public class WsFrameServer extends WsFra while (isOpen() && !isSuspended()) { // Fill up the input buffer with as much data as we can - inputBuffer.mark(); - inputBuffer.position(inputBuffer.limit()).limit(inputBuffer.capacity()); + ((Buffer)inputBuffer).mark(); + ((Buffer)inputBuffer).position(inputBuffer.limit()).limit(inputBuffer.capacity()); int read = socketWrapper.read(false, inputBuffer); - inputBuffer.limit(inputBuffer.position()).reset(); + ((Buffer)inputBuffer).limit(inputBuffer.position()).reset(); if (read < 0) { throw new EOFException(); } else if (read == 0) { diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/WsFrameBase.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/WsFrameBase.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/WsFrameBase.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/WsFrameBase.java 2021-10-18 22:46:03.756843123 +0200 @@ -17,6 +17,7 @@ package org.apache.tomcat.websocket; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharsetDecoder; @@ -91,7 +92,7 @@ public abstract class WsFrameBase { public WsFrameBase(WsSession wsSession, Transformation transformation) { inputBuffer = ByteBuffer.allocate(Constants.DEFAULT_BUFFER_SIZE); - inputBuffer.position(0).limit(0); + ((Buffer)inputBuffer).position(0).limit(0); messageBufferBinary = ByteBuffer.allocate(wsSession.getMaxBinaryMessageBufferSize()); messageBufferText = CharBuffer.allocate(wsSession.getMaxTextMessageBufferSize()); wsSession.setWsFrame(this); @@ -257,7 +258,7 @@ public abstract class WsFrameBase { if (payloadLength == 126) { payloadLength = byteArrayToLong(inputBuffer.array(), inputBuffer.arrayOffset() + inputBuffer.position(), 2); - inputBuffer.position(inputBuffer.position() + 2); + ((Buffer)inputBuffer).position(inputBuffer.position() + 2); } else if (payloadLength == 127) { payloadLength = byteArrayToLong(inputBuffer.array(), inputBuffer.arrayOffset() + inputBuffer.position(), 8); @@ -268,7 +269,7 @@ public abstract class WsFrameBase { throw new WsIOException( new CloseReason(CloseCodes.PROTOCOL_ERROR, sm.getString("wsFrame.payloadMsbInvalid"))); } - inputBuffer.position(inputBuffer.position() + 8); + ((Buffer)inputBuffer).position(inputBuffer.position() + 8); } if (Util.isControl(opCode)) { if (payloadLength > 125) { @@ -333,13 +334,13 @@ public abstract class WsFrameBase { // Control messages have fixed message size so // TransformationResult.OVERFLOW is not possible here - controlBufferBinary.flip(); + ((Buffer)controlBufferBinary).flip(); if (opCode == Constants.OPCODE_CLOSE) { open = false; String reason = null; int code = CloseCodes.NORMAL_CLOSURE.getCode(); if (controlBufferBinary.remaining() == 1) { - controlBufferBinary.clear(); + ((Buffer)controlBufferBinary).clear(); // Payload must be zero or 2+ bytes long throw new WsIOException(new CloseReason( CloseCodes.PROTOCOL_ERROR, @@ -351,8 +352,8 @@ public abstract class WsFrameBase { CoderResult cr = utf8DecoderControl.decode(controlBufferBinary, controlBufferText, true); if (cr.isError()) { - controlBufferBinary.clear(); - controlBufferText.clear(); + ((Buffer)controlBufferBinary).clear(); + ((Buffer)controlBufferText).clear(); throw new WsIOException(new CloseReason( CloseCodes.PROTOCOL_ERROR, sm.getString("wsFrame.invalidUtf8Close"))); @@ -360,7 +361,7 @@ public abstract class WsFrameBase { // There will be no overflow as the output buffer is big // enough. There will be no underflow as all the data is // passed to the decoder in a single call. - controlBufferText.flip(); + ((Buffer)controlBufferText).flip(); reason = controlBufferText.toString(); } } @@ -377,17 +378,17 @@ public abstract class WsFrameBase { } catch (Throwable t) { handleThrowableOnSend(t); } finally { - controlBufferBinary.clear(); + ((Buffer)controlBufferBinary).clear(); } } } else { // Should have caught this earlier but just in case... - controlBufferBinary.clear(); + ((Buffer)controlBufferBinary).clear(); throw new WsIOException(new CloseReason( CloseCodes.PROTOCOL_ERROR, sm.getString("wsFrame.invalidOpCode", Integer.valueOf(opCode)))); } - controlBufferBinary.clear(); + ((Buffer)controlBufferBinary).clear(); newFrame(); return true; } @@ -417,7 +418,7 @@ public abstract class WsFrameBase { } catch (Throwable t) { handleThrowableOnSend(t); } finally { - messageBufferText.clear(); + ((Buffer)messageBufferText).clear(); } } @@ -428,7 +429,7 @@ public abstract class WsFrameBase { while (!TransformationResult.END_OF_FRAME.equals(tr)) { // Frame not complete - we ran out of something // Convert bytes to UTF-8 - messageBufferBinary.flip(); + ((Buffer)messageBufferBinary).flip(); while (true) { CoderResult cr = utf8DecoderMessage.decode(messageBufferBinary, messageBufferText, false); @@ -439,9 +440,9 @@ public abstract class WsFrameBase { } else if (cr.isOverflow()) { // Ran out of space in text buffer - flush it if (usePartial()) { - messageBufferText.flip(); + ((Buffer)messageBufferText).flip(); sendMessageText(false); - messageBufferText.clear(); + ((Buffer)messageBufferText).clear(); } else { throw new WsIOException(new CloseReason( CloseCodes.TOO_BIG, @@ -468,7 +469,7 @@ public abstract class WsFrameBase { tr = transformation.getMoreData(opCode, fin, rsv, messageBufferBinary); } - messageBufferBinary.flip(); + ((Buffer)messageBufferBinary).flip(); boolean last = false; // Frame is fully received // Convert bytes to UTF-8 @@ -482,9 +483,9 @@ public abstract class WsFrameBase { } else if (cr.isOverflow()) { // Ran out of space in text buffer - flush it if (usePartial()) { - messageBufferText.flip(); + ((Buffer)messageBufferText).flip(); sendMessageText(false); - messageBufferText.clear(); + ((Buffer)messageBufferText).clear(); } else { throw new WsIOException(new CloseReason( CloseCodes.TOO_BIG, @@ -497,9 +498,9 @@ public abstract class WsFrameBase { // If partial messages are supported, send what we have // managed to decode if (usePartial()) { - messageBufferText.flip(); + ((Buffer)messageBufferText).flip(); sendMessageText(false); - messageBufferText.clear(); + ((Buffer)messageBufferText).clear(); } messageBufferBinary.compact(); newFrame(); @@ -511,7 +512,7 @@ public abstract class WsFrameBase { } } else { // End of message - messageBufferText.flip(); + ((Buffer)messageBufferText).flip(); sendMessageText(true); newMessage(); @@ -539,12 +540,12 @@ public abstract class WsFrameBase { Long.valueOf(payloadLength))); throw new WsIOException(cr); } - messageBufferBinary.flip(); + ((Buffer)messageBufferBinary).flip(); ByteBuffer copy = ByteBuffer.allocate(messageBufferBinary.limit()); copy.put(messageBufferBinary); - copy.flip(); + ((Buffer)copy).flip(); sendMessageBinary(copy, false); - messageBufferBinary.clear(); + ((Buffer)messageBufferBinary).clear(); // Read more data tr = transformation.getMoreData(opCode, fin, rsv, messageBufferBinary); } @@ -554,12 +555,12 @@ public abstract class WsFrameBase { // - partial messages are supported // - the message is complete if (usePartial() || !continuationExpected) { - messageBufferBinary.flip(); + ((Buffer)messageBufferBinary).flip(); ByteBuffer copy = ByteBuffer.allocate(messageBufferBinary.limit()); copy.put(messageBufferBinary); - copy.flip(); + ((Buffer)copy).flip(); sendMessageBinary(copy, !continuationExpected); - messageBufferBinary.clear(); + ((Buffer)messageBufferBinary).clear(); } if (continuationExpected) { @@ -608,8 +609,8 @@ public abstract class WsFrameBase { private void newMessage() { - messageBufferBinary.clear(); - messageBufferText.clear(); + ((Buffer)messageBufferBinary).clear(); + ((Buffer)messageBufferText).clear(); utf8DecoderMessage.reset(); continuationExpected = false; newFrame(); @@ -618,7 +619,7 @@ public abstract class WsFrameBase { private void newFrame() { if (inputBuffer.remaining() == 0) { - inputBuffer.position(0).limit(0); + ((Buffer)inputBuffer).position(0).limit(0); } maskIndex = 0; @@ -651,7 +652,7 @@ public abstract class WsFrameBase { private void makeRoom() { inputBuffer.compact(); - inputBuffer.flip(); + ((Buffer)inputBuffer).flip(); } @@ -669,7 +670,7 @@ public abstract class WsFrameBase { private boolean swallowInput() { long toSkip = Math.min(payloadLength - payloadWritten, inputBuffer.remaining()); - inputBuffer.position(inputBuffer.position() + (int) toSkip); + ((Buffer)inputBuffer).position(inputBuffer.position() + (int) toSkip); payloadWritten += toSkip; if (payloadWritten == payloadLength) { if (continuationExpected) { @@ -965,9 +966,9 @@ public abstract class WsFrameBase { toWrite = Math.min(toWrite, dest.remaining()); int orgLimit = inputBuffer.limit(); - inputBuffer.limit(inputBuffer.position() + (int) toWrite); + ((Buffer)inputBuffer).limit(inputBuffer.position() + (int) toWrite); dest.put(inputBuffer); - inputBuffer.limit(orgLimit); + ((Buffer)inputBuffer).limit(orgLimit); payloadWritten += toWrite; if (payloadWritten == payloadLength) { diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/WsFrameClient.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/WsFrameClient.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/WsFrameClient.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/WsFrameClient.java 2021-10-18 22:46:03.760843139 +0200 @@ -18,6 +18,7 @@ package org.apache.tomcat.websocket; import java.io.EOFException; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.CompletionHandler; @@ -76,8 +77,8 @@ public class WsFrameClient extends WsFra // and then a new socket read will be performed return; } - inputBuffer.mark(); - inputBuffer.position(inputBuffer.limit()).limit(inputBuffer.capacity()); + ((Buffer)inputBuffer).mark(); + ((Buffer)inputBuffer).position(inputBuffer.limit()).limit(inputBuffer.capacity()); int toCopy = Math.min(response.remaining(), inputBuffer.remaining()); @@ -85,16 +86,16 @@ public class WsFrameClient extends WsFra // frame processing int orgLimit = response.limit(); - response.limit(response.position() + toCopy); + ((Buffer)response).limit(response.position() + toCopy); inputBuffer.put(response); - response.limit(orgLimit); + ((Buffer)response).limit(orgLimit); - inputBuffer.limit(inputBuffer.position()).reset(); + ((Buffer)inputBuffer).limit(inputBuffer.position()).reset(); // Process the data we have processInputBuffer(); } - response.clear(); + ((Buffer)response).clear(); // Get some more data if (isOpen()) { @@ -159,7 +160,7 @@ public class WsFrameClient extends WsFra // No data to process return; } - response.flip(); + ((Buffer)response).flip(); doResumeProcessing(true); } @@ -172,7 +173,7 @@ public class WsFrameClient extends WsFra // response will be empty if this exception is thrown response = ByteBuffer .allocate(((ReadBufferOverflowException) exc).getMinBufferSize()); - response.flip(); + ((Buffer)response).flip(); doResumeProcessing(false); } else { close(exc); diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 2021-10-18 22:46:03.760843139 +0200 @@ -20,6 +20,7 @@ import java.io.IOException; import java.io.OutputStream; import java.io.Writer; import java.net.SocketTimeoutException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharsetEncoder; @@ -241,13 +242,13 @@ public abstract class WsRemoteEndpointIm long timeoutExpiry = getTimeoutExpiry(); boolean isDone = false; while (!isDone) { - encoderBuffer.clear(); + ((Buffer)encoderBuffer).clear(); CoderResult cr = encoder.encode(part, encoderBuffer, true); if (cr.isError()) { throw new IllegalArgumentException(cr.toString()); } isDone = !cr.isOverflow(); - encoderBuffer.flip(); + ((Buffer)encoderBuffer).flip(); sendMessageBlock(Constants.OPCODE_TEXT, encoderBuffer, last && isDone, timeoutExpiry); } stateMachine.complete(last); @@ -330,7 +331,7 @@ public abstract class WsRemoteEndpointIm } if (payload != null) { - payload.clear(); + ((Buffer)payload).clear(); } endMessage(null, null); @@ -442,7 +443,7 @@ public abstract class WsRemoteEndpointIm if (Constants.INTERNAL_OPCODE_FLUSH == mp.getOpCode()) { nextFragmented = fragmented; nextText = text; - outputBuffer.flip(); + ((Buffer)outputBuffer).flip(); SendHandler flushHandler = new OutputBufferFlushSendHandler( outputBuffer, mp.getEndHandler()); doWrite(flushHandler, mp.getBlockingWriteTimeoutExpiry(), outputBuffer); @@ -492,10 +493,10 @@ public abstract class WsRemoteEndpointIm } int payloadSize = mp.getPayload().remaining(); - headerBuffer.clear(); + ((Buffer)headerBuffer).clear(); writeHeader(headerBuffer, mp.isFin(), mp.getRsv(), mp.getOpCode(), isMasked(), mp.getPayload(), mask, first); - headerBuffer.flip(); + ((Buffer)headerBuffer).flip(); if (getBatchingAllowed() || isMasked()) { // Need to write via output buffer @@ -822,13 +823,13 @@ public abstract class WsRemoteEndpointIm } public void write() { - buffer.clear(); + ((Buffer)buffer).clear(); CoderResult cr = encoder.encode(message, buffer, true); if (cr.isError()) { throw new IllegalArgumentException(cr.toString()); } isDone = !cr.isOverflow(); - buffer.flip(); + ((Buffer)buffer).flip(); endpoint.startMessage(Constants.OPCODE_TEXT, buffer, isDone && isLast, this); } @@ -889,7 +890,7 @@ public abstract class WsRemoteEndpointIm } if (headerBuffer.hasRemaining()) { // Still more headers to write, need to flush - outputBuffer.flip(); + ((Buffer)outputBuffer).flip(); endpoint.doWrite(this, blockingWriteTimeoutExpiry, outputBuffer); return; } @@ -903,7 +904,7 @@ public abstract class WsRemoteEndpointIm if (payloadLeft > outputSpace) { toWrite = outputSpace; // Temporarily reduce the limit - payload.limit(payload.position() + toWrite); + ((Buffer)payload).limit(payload.position() + toWrite); } if (mask == null) { @@ -921,15 +922,15 @@ public abstract class WsRemoteEndpointIm if (payloadLeft > outputSpace) { // Restore the original limit - payload.limit(payloadLimit); + ((Buffer)payload).limit(payloadLimit); // Still more data to write, need to flush - outputBuffer.flip(); + ((Buffer)outputBuffer).flip(); endpoint.doWrite(this, blockingWriteTimeoutExpiry, outputBuffer); return; } if (flushRequired) { - outputBuffer.flip(); + ((Buffer)outputBuffer).flip(); if (outputBuffer.remaining() == 0) { handler.onResult(SENDRESULT_OK); } else { @@ -947,7 +948,7 @@ public abstract class WsRemoteEndpointIm if (outputBuffer.hasRemaining()) { endpoint.doWrite(this, blockingWriteTimeoutExpiry, outputBuffer); } else { - outputBuffer.clear(); + ((Buffer)outputBuffer).clear(); write(); } } else { @@ -973,7 +974,7 @@ public abstract class WsRemoteEndpointIm @Override public void onResult(SendResult result) { if (result.isOK()) { - outputBuffer.clear(); + ((Buffer)outputBuffer).clear(); } handler.onResult(result); } @@ -1066,11 +1067,11 @@ public abstract class WsRemoteEndpointIm private void doWrite(boolean last) throws IOException { if (used) { - buffer.flip(); + ((Buffer)buffer).flip(); endpoint.sendMessageBlock(Constants.OPCODE_BINARY, buffer, last); } endpoint.stateMachine.complete(last); - buffer.clear(); + ((Buffer)buffer).clear(); } } @@ -1145,9 +1146,9 @@ public abstract class WsRemoteEndpointIm private void doWrite(boolean last) throws IOException { if (used) { - buffer.flip(); + ((Buffer)buffer).flip(); endpoint.sendMessageBlock(buffer, last); - buffer.clear(); + ((Buffer)buffer).clear(); } else { endpoint.stateMachine.complete(last); } diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/WsSession.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/WsSession.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/WsSession.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/WsSession.java 2021-10-18 22:46:03.760843139 +0200 @@ -18,6 +18,7 @@ package org.apache.tomcat.websocket; import java.io.IOException; import java.net.URI; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.WritePendingException; import java.nio.charset.StandardCharsets; @@ -608,7 +609,7 @@ public class WsSession implements Sessio if (reason != null && reason.length() > 0) { appendCloseReasonWithTruncation(msg, reason); } - msg.flip(); + ((Buffer)msg).flip(); try { wsRemoteEndpoint.sendMessageBlock(Constants.OPCODE_CLOSE, msg, true); } catch (IOException | WritePendingException e) { diff -Napur apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/WsWebSocketContainer.java apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/WsWebSocketContainer.java --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/websocket/WsWebSocketContainer.java 2021-01-28 21:36:30.000000000 +0100 +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/websocket/WsWebSocketContainer.java 2021-10-18 22:46:03.760843139 +0200 @@ -27,6 +27,7 @@ import java.net.ProxySelector; import java.net.SocketAddress; import java.net.URI; import java.net.URISyntaxException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousChannelGroup; import java.nio.channels.AsynchronousSocketChannel; @@ -753,7 +754,7 @@ public class WsWebSocketContainer implem // Terminating CRLF result.put(CRLF); - result.flip(); + ((Buffer)result).flip(); return result; } @@ -782,7 +783,7 @@ public class WsWebSocketContainer implem newSize = input.capacity() * 2; } ByteBuffer expanded = ByteBuffer.allocate(newSize); - input.flip(); + ((Buffer)input).flip(); expanded.put(input); input = expanded; } @@ -811,7 +812,7 @@ public class WsWebSocketContainer implem while (!readHeaders) { // On entering loop buffer will be empty and at the start of a new // loop the buffer will have been fully read. - response.clear(); + ((Buffer)response).clear(); // Blocking read Future read = channel.read(response); Integer bytesRead; @@ -826,7 +827,7 @@ public class WsWebSocketContainer implem if (bytesRead.intValue() == -1) { throw new EOFException(sm.getString("wsWebSocketContainer.responseFail", Integer.toString(status), headers)); } - response.flip(); + ((Buffer)response).flip(); while (response.hasRemaining() && !readHeaders) { if (line == null) { line = readLine(response); diff -Napur apache-tomcat-9.0.43-src.orig/test/org/apache/coyote/http11/upgrade/TestUpgradeInternalHandler.java apache-tomcat-9.0.43-src/test/org/apache/coyote/http11/upgrade/TestUpgradeInternalHandler.java --- apache-tomcat-9.0.43-src.orig/test/org/apache/coyote/http11/upgrade/TestUpgradeInternalHandler.java 2021-01-28 21:36:33.000000000 +0100 +++ apache-tomcat-9.0.43-src/test/org/apache/coyote/http11/upgrade/TestUpgradeInternalHandler.java 2021-10-18 22:46:03.760843139 +0200 @@ -25,6 +25,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Writer; import java.net.Socket; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.CompletionHandler; import java.nio.charset.StandardCharsets; @@ -210,7 +211,7 @@ public class TestUpgradeInternalHandler } private void write(ByteBuffer buffer) { - buffer.flip(); + ((Buffer)buffer).flip(); CompletionState state = wrapper.write(BlockingMode.BLOCK, 10, TimeUnit.SECONDS, null, SocketWrapperBase.COMPLETE_WRITE, new CompletionHandler() { @Override public void completed(Long result, Void attachment) { diff -Napur apache-tomcat-9.0.43-src.orig/test/org/apache/coyote/http2/Http2TestBase.java apache-tomcat-9.0.43-src/test/org/apache/coyote/http2/Http2TestBase.java --- apache-tomcat-9.0.43-src.orig/test/org/apache/coyote/http2/Http2TestBase.java 2021-01-28 21:36:33.000000000 +0100 +++ apache-tomcat-9.0.43-src/test/org/apache/coyote/http2/Http2TestBase.java 2021-10-18 22:46:03.760843139 +0200 @@ -23,6 +23,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.SocketException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -222,7 +223,7 @@ public abstract class Http2TestBase exte if (padding != null) { headersPayload.put(padding); } - headersPayload.flip(); + ((Buffer)headersPayload).flip(); ByteUtil.setThreeBytes(frameHeader, 0, headersPayload.limit()); frameHeader[3] = FrameType.HEADERS.getIdByte(); @@ -255,7 +256,7 @@ public abstract class Http2TestBase exte } hpackEncoder.encode(mimeHeaders, headersPayload); - headersPayload.flip(); + ((Buffer)headersPayload).flip(); ByteUtil.setThreeBytes(frameHeader, 0, headersPayload.limit()); frameHeader[3] = FrameType.HEADERS.getIdByte(); @@ -283,7 +284,7 @@ public abstract class Http2TestBase exte } hpackEncoder.encode(mimeHeaders, headersPayload); - headersPayload.flip(); + ((Buffer)headersPayload).flip(); ByteUtil.setThreeBytes(frameHeader, 0, headersPayload.limit()); frameHeader[3] = FrameType.CONTINUATION.getIdByte(); @@ -373,7 +374,7 @@ public abstract class Http2TestBase exte } hpackEncoder.encode(headers, headersPayload); - headersPayload.flip(); + ((Buffer)headersPayload).flip(); ByteUtil.setThreeBytes(headersFrameHeader, 0, headersPayload.limit()); headersFrameHeader[3] = FrameType.HEADERS.getIdByte(); @@ -385,18 +386,18 @@ public abstract class Http2TestBase exte // Data if (padding != null) { dataPayload.put((byte) (padding.length & 0xFF)); - dataPayload.limit(dataPayload.capacity() - padding.length); + ((Buffer)dataPayload).limit(dataPayload.capacity() - padding.length); } while (dataPayload.hasRemaining()) { dataPayload.put((byte) 'x'); } if (padding != null && padding.length > 0) { - dataPayload.limit(dataPayload.capacity()); + ((Buffer)dataPayload).limit(dataPayload.capacity()); dataPayload.put(padding); } - dataPayload.flip(); + ((Buffer)dataPayload).flip(); // Size ByteUtil.setThreeBytes(dataFrameHeader, 0, dataPayload.limit()); @@ -418,7 +419,7 @@ public abstract class Http2TestBase exte trailerHeaders.addValue(TRAILER_HEADER_NAME).setString(TRAILER_HEADER_VALUE); hpackEncoder.encode(trailerHeaders, trailersPayload); - trailersPayload.flip(); + ((Buffer)trailersPayload).flip(); ByteUtil.setThreeBytes(trailersFrameHeader, 0, trailersPayload.limit()); trailersFrameHeader[3] = FrameType.HEADERS.getIdByte(); @@ -1032,7 +1033,7 @@ public abstract class Http2TestBase exte if (bodyBuffer != null) { if (bodyBuffer.limit() > 0) { trace.append(lastStreamId + "-Body-"); - bodyBuffer.flip(); + ((Buffer)bodyBuffer).flip(); while (bodyBuffer.hasRemaining()) { trace.append((char) bodyBuffer.get()); } diff -Napur apache-tomcat-9.0.43-src.orig/test/org/apache/coyote/http2/TestHpack.java apache-tomcat-9.0.43-src/test/org/apache/coyote/http2/TestHpack.java --- apache-tomcat-9.0.43-src.orig/test/org/apache/coyote/http2/TestHpack.java 2021-01-28 21:36:33.000000000 +0100 +++ apache-tomcat-9.0.43-src/test/org/apache/coyote/http2/TestHpack.java 2021-10-18 22:46:03.760843139 +0200 @@ -16,6 +16,7 @@ */ package org.apache.coyote.http2; +import java.nio.Buffer; import java.nio.ByteBuffer; import org.junit.Assert; @@ -34,13 +35,13 @@ public class TestHpack { ByteBuffer output = ByteBuffer.allocate(512); HpackEncoder encoder = new HpackEncoder(); encoder.encode(headers, output); - output.flip(); + ((Buffer)output).flip(); // Size is supposed to be 33 without huffman, or 27 with it // TODO: use the HpackHeaderFunction to enable huffman predictably Assert.assertEquals(27, output.remaining()); - output.clear(); + ((Buffer)output).clear(); encoder.encode(headers, output); - output.flip(); + ((Buffer)output).flip(); // Size is now 3 after using the table Assert.assertEquals(3, output.remaining()); } @@ -54,15 +55,15 @@ public class TestHpack { ByteBuffer output = ByteBuffer.allocate(512); HpackEncoder encoder = new HpackEncoder(); encoder.encode(headers, output); - output.flip(); + ((Buffer)output).flip(); MimeHeaders headers2 = new MimeHeaders(); HpackDecoder decoder = new HpackDecoder(); decoder.setHeaderEmitter(new HeadersListener(headers2)); decoder.decode(output); // Redo (table is supposed to be updated) - output.clear(); + ((Buffer)output).clear(); encoder.encode(headers, output); - output.flip(); + ((Buffer)output).flip(); headers2.recycle(); Assert.assertEquals(3, output.remaining()); // Check that the decoder is using the table right @@ -120,7 +121,7 @@ public class TestHpack { // by another byte output.array()[7] = (byte) -122; output.put((byte) -1); - output.flip(); + ((Buffer)output).flip(); MimeHeaders headers2 = new MimeHeaders(); HpackDecoder decoder = new HpackDecoder(); decoder.setHeaderEmitter(new HeadersListener(headers2)); @@ -136,7 +137,7 @@ public class TestHpack { ByteBuffer output = ByteBuffer.allocate(512); HpackEncoder encoder = new HpackEncoder(); encoder.encode(headers, output); - output.flip(); + ((Buffer)output).flip(); MimeHeaders headers2 = new MimeHeaders(); HpackDecoder decoder = new HpackDecoder(); decoder.setHeaderEmitter(new HeadersListener(headers2)); diff -Napur apache-tomcat-9.0.43-src.orig/test/org/apache/coyote/http2/TestHttp2Limits.java apache-tomcat-9.0.43-src/test/org/apache/coyote/http2/TestHttp2Limits.java --- apache-tomcat-9.0.43-src.orig/test/org/apache/coyote/http2/TestHttp2Limits.java 2021-01-28 21:36:33.000000000 +0100 +++ apache-tomcat-9.0.43-src/test/org/apache/coyote/http2/TestHttp2Limits.java 2021-10-18 22:46:03.764843154 +0200 @@ -17,6 +17,7 @@ package org.apache.coyote.http2; import java.io.IOException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; @@ -324,7 +325,7 @@ public class TestHttp2Limits extends Htt if (state != State.COMPLETE) { throw new Exception("Unable to build headers"); } - headersPayload.flip(); + ((Buffer)headersPayload).flip(); log.debug("Headers payload generated of size [" + headersPayload.limit() + "]"); } diff -Napur apache-tomcat-9.0.43-src.orig/test/org/apache/coyote/http2/TestHttp2Section_8_1.java apache-tomcat-9.0.43-src/test/org/apache/coyote/http2/TestHttp2Section_8_1.java --- apache-tomcat-9.0.43-src.orig/test/org/apache/coyote/http2/TestHttp2Section_8_1.java 2021-01-28 21:36:33.000000000 +0100 +++ apache-tomcat-9.0.43-src/test/org/apache/coyote/http2/TestHttp2Section_8_1.java 2021-10-18 22:46:03.764843154 +0200 @@ -16,6 +16,7 @@ */ package org.apache.coyote.http2; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; @@ -225,7 +226,7 @@ public class TestHttp2Section_8_1 extend headers.clear(); headers.add(new Header(":authority", "localhost:" + getPort())); - headersPayload.clear(); + ((Buffer)headersPayload).clear(); buildSimpleGetRequestPart2(headersFrameHeader, headersPayload, headers , 3); diff -Napur apache-tomcat-9.0.43-src.orig/test/org/apache/tomcat/util/buf/TestUtf8.java apache-tomcat-9.0.43-src/test/org/apache/tomcat/util/buf/TestUtf8.java --- apache-tomcat-9.0.43-src.orig/test/org/apache/tomcat/util/buf/TestUtf8.java 2021-01-28 21:36:34.000000000 +0100 +++ apache-tomcat-9.0.43-src/test/org/apache/tomcat/util/buf/TestUtf8.java 2021-10-18 22:46:03.764843154 +0200 @@ -16,6 +16,7 @@ */ package org.apache.tomcat.util.buf; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharsetDecoder; @@ -579,7 +580,7 @@ public class TestUtf8 { // an invalid sequence has been provided for (int i = 0; i < len; i++) { bb.put((byte) testCase.input[i]); - bb.flip(); + ((Buffer)bb).flip(); CoderResult cr = decoder.decode(bb, cb, false); if (cr.isError()) { int expected = testCase.invalidIndex; @@ -604,11 +605,11 @@ public class TestUtf8 { decoder.onUnmappableCharacter(CodingErrorAction.REPLACE); // Add each byte one at a time. - bb.clear(); - cb.clear(); + ((Buffer)bb).clear(); + ((Buffer)cb).clear(); for (int i = 0; i < len; i++) { bb.put((byte) testCase.input[i]); - bb.flip(); + ((Buffer)bb).flip(); CoderResult cr = decoder.decode(bb, cb, false); if (cr.isError()) { Assert.fail(testCase.description); @@ -617,12 +618,12 @@ public class TestUtf8 { } // For incomplete sequences at the end of the input need to tell // the decoder the input has ended - bb.flip(); + ((Buffer)bb).flip(); CoderResult cr = decoder.decode(bb, cb, true); if (cr.isError()) { Assert.fail(testCase.description); } - cb.flip(); + ((Buffer)cb).flip(); String expected = testCase.outputReplaced; if ((flags & REPLACE_SWALLOWS_TRAILER) != 0) { diff -Napur apache-tomcat-9.0.43-src.orig/test/org/apache/tomcat/websocket/pojo/TestEncodingDecoding.java apache-tomcat-9.0.43-src/test/org/apache/tomcat/websocket/pojo/TestEncodingDecoding.java --- apache-tomcat-9.0.43-src.orig/test/org/apache/tomcat/websocket/pojo/TestEncodingDecoding.java 2021-01-28 21:36:34.000000000 +0100 +++ apache-tomcat-9.0.43-src/test/org/apache/tomcat/websocket/pojo/TestEncodingDecoding.java 2021-10-18 22:46:03.764843154 +0200 @@ -18,6 +18,7 @@ package org.apache.tomcat.websocket.pojo import java.io.IOException; import java.net.URI; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; @@ -606,7 +607,7 @@ public class TestEncodingDecoding extend reply.put((byte) 0x12); reply.put((byte) 0x34); reply.put(data); - reply.flip(); + ((Buffer)reply).flip(); return reply; } }