File netty3-CVE-2024-29025.patch of Package netty3
--- a/src/main/java/org/jboss/netty/handler/codec/http/multipart/HttpPostMultipartRequestDecoder.java 2016-06-29 14:41:47.000000000 +0200
+++ b/src/main/java/org/jboss/netty/handler/codec/http/multipart/HttpPostMultipartRequestDecoder.java 2024-07-04 12:42:30.682137342 +0200
@@ -53,6 +53,16 @@
private final HttpRequest request;
/**
+ * The maximum number of fields allows by the form
+ */
+ private final int maxFields;
+
+ /**
+ * The maximum number of accumulated bytes when decoding a field
+ */
+ private final int maxBufferedBytes;
+
+ /**
* Default charset to use
*/
private Charset charset;
@@ -147,6 +157,23 @@
*/
public HttpPostMultipartRequestDecoder(HttpDataFactory factory, HttpRequest request,
Charset charset) throws ErrorDataDecoderException {
+ this(factory, request, charset, HttpPostRequestDecoder.DEFAULT_MAX_FIELDS, HttpPostRequestDecoder.DEFAULT_MAX_BUFFERED_BYTES);
+ }
+
+ /**
+ *
+ * @param factory the factory used to create InterfaceHttpData
+ * @param request the request to decode
+ * @param charset the charset to use as default
+ * @param maxFields
+ * the maximum number of fields the form can have, {@code -1} to disable
+ * @param maxBufferedBytes
+ * the maximum number of bytes the decoder can buffer when decoding a field, {@code -1} to disable
+ * @throws NullPointerException for request or charset or factory
+ * @throws ErrorDataDecoderException if the default charset was wrong when decoding or other errors
+ */
+ public HttpPostMultipartRequestDecoder(HttpDataFactory factory, HttpRequest request,
+ Charset charset, int maxFields, int maxBufferedBytes) throws ErrorDataDecoderException {
if (factory == null) {
throw new NullPointerException("factory");
}
@@ -159,6 +186,8 @@
this.request = request;
this.charset = charset;
this.factory = factory;
+ this.maxFields = maxFields;
+ this.maxBufferedBytes = maxBufferedBytes;
// Fill default values
setMultipart(this.request.headers().get(HttpHeaders.Names.CONTENT_TYPE));
if (!this.request.isChunked()) {
@@ -230,6 +259,9 @@
isLastChunk = true;
}
parseBody();
+ if (maxBufferedBytes > 0 && undecodedChunk != null && undecodedChunk.readableBytes() > maxBufferedBytes) {
+ throw new ErrorDataDecoderException();
+ }
}
public boolean hasNext() throws EndOfDataDecoderException {
@@ -268,10 +300,13 @@
/**
* Utility function to add a new decoded data
*/
- private void addHttpData(InterfaceHttpData data) {
+ private void addHttpData(InterfaceHttpData data) throws ErrorDataDecoderException {
if (data == null) {
return;
}
+ if (maxFields > 0 && bodyListHttpData.size() >= maxFields) {
+ throw new ErrorDataDecoderException();
+ }
List<InterfaceHttpData> datas = bodyMapHttpData.get(data.getName());
if (datas == null) {
datas = new ArrayList<InterfaceHttpData>(1);
--- a/src/main/java/org/jboss/netty/handler/codec/http/multipart/HttpPostRequestDecoder.java 2016-06-29 14:41:47.000000000 +0200
+++ b/src/main/java/org/jboss/netty/handler/codec/http/multipart/HttpPostRequestDecoder.java 2024-07-04 12:27:23.372964684 +0200
@@ -28,6 +28,11 @@
* This decoder will decode Body and can handle POST BODY (both multipart and standard).
*/
public class HttpPostRequestDecoder implements InterfaceHttpPostRequestDecoder {
+
+ static final int DEFAULT_MAX_FIELDS = 128;
+
+ static final int DEFAULT_MAX_BUFFERED_BYTES = 1024;
+
/**
* Does this request is a Multipart request
*/
@@ -58,6 +63,25 @@
/**
*
+ * @param request
+ * the request to decode
+ * @param maxFields
+ * the maximum number of fields the form can have, {@code -1} to disable
+ * @param maxBufferedBytes
+ * the maximum number of bytes the decoder can buffer when decoding a field, {@code -1} to disable
+ * @throws NullPointerException
+ * for request
+ * @throws ErrorDataDecoderException
+ * if the default charset was wrong when decoding or other
+ * errors
+ */
+ public HttpPostRequestDecoder(HttpRequest request, int maxFields, int maxBufferedBytes) throws ErrorDataDecoderException {
+ this(new DefaultHttpDataFactory(DefaultHttpDataFactory.MINSIZE), request, HttpConstants.DEFAULT_CHARSET,
+ maxFields, maxBufferedBytes);
+ }
+
+ /**
+ *
* @param factory the factory used to create InterfaceHttpData
* @param request the request to decode
* @param charset the charset to use as default
@@ -66,6 +90,23 @@
*/
public HttpPostRequestDecoder(HttpDataFactory factory, HttpRequest request,
Charset charset) throws ErrorDataDecoderException {
+ this(factory, request, charset, HttpPostRequestDecoder.DEFAULT_MAX_FIELDS,
+ HttpPostRequestDecoder.DEFAULT_MAX_BUFFERED_BYTES);
+ }
+
+ /**
+ *
+ * @param factory the factory used to create InterfaceHttpData
+ * @param request the request to decode
+ * @param charset the charset to use as default
+ * @param maxFields the maximum number of fields the form can have, {@code -1} to disable
+ * @param maxBufferedBytes
+ * the maximum number of bytes the decoder can buffer when decoding a field, {@code -1} to disable
+ * @throws NullPointerException for request or charset or factory
+ * @throws ErrorDataDecoderException if the default charset was wrong when decoding or other errors
+ */
+ public HttpPostRequestDecoder(HttpDataFactory factory, HttpRequest request, Charset charset,
+ int maxFields, int maxBufferedBytes) throws ErrorDataDecoderException {
if (factory == null) {
throw new NullPointerException("factory");
}
@@ -77,9 +118,9 @@
}
// Fill default values
if (isMultipart(request)) {
- decoder = new HttpPostMultipartRequestDecoder(factory, request, charset);
+ decoder = new HttpPostMultipartRequestDecoder(factory, request, charset, maxFields, maxBufferedBytes);
} else {
- decoder = new HttpPostStandardRequestDecoder(factory, request, charset);
+ decoder = new HttpPostStandardRequestDecoder(factory, request, charset, maxFields, maxBufferedBytes);
}
}
--- a/src/main/java/org/jboss/netty/handler/codec/http/multipart/HttpPostStandardRequestDecoder.java 2016-06-29 14:41:47.000000000 +0200
+++ b/src/main/java/org/jboss/netty/handler/codec/http/multipart/HttpPostStandardRequestDecoder.java 2024-07-04 12:39:27.134939191 +0200
@@ -57,6 +57,16 @@
private final Charset charset;
/**
+ * The maximum number of fields allows by the form
+ */
+ private final int maxFields;
+
+ /**
+ * The maximum number of accumulated bytes when decoding a field
+ */
+ private final int maxBufferedBytes;
+
+ /**
* Does the last chunk already received
*/
private boolean isLastChunk;
@@ -125,6 +135,21 @@
*/
public HttpPostStandardRequestDecoder(HttpDataFactory factory, HttpRequest request,
Charset charset) throws ErrorDataDecoderException {
+ this(factory, request, charset, HttpPostRequestDecoder.DEFAULT_MAX_FIELDS, HttpPostRequestDecoder.DEFAULT_MAX_BUFFERED_BYTES);
+ }
+
+ /**
+ *
+ * @param factory the factory used to create InterfaceHttpData
+ * @param request the request to decode
+ * @param charset the charset to use as default
+ * @param maxFields the maximum number of fields the form can have, {@code -1} to disable
+ * @param maxBufferedBytes the maximum number of bytes the decoder can buffer when decoding a field, {@code -1} to disable
+ * @throws NullPointerException for request or charset or factory
+ * @throws ErrorDataDecoderException if the default charset was wrong when decoding or other errors
+ */
+ public HttpPostStandardRequestDecoder(HttpDataFactory factory, HttpRequest request,
+ Charset charset, int maxFields, int maxBufferedBytes) throws ErrorDataDecoderException {
if (factory == null) {
throw new NullPointerException("factory");
}
@@ -137,6 +162,8 @@
this.request = request;
this.charset = charset;
this.factory = factory;
+ this.maxFields = maxFields;
+ this.maxBufferedBytes = maxBufferedBytes;
if (!this.request.isChunked()) {
undecodedChunk = this.request.getContent();
isLastChunk = true;
@@ -190,6 +217,9 @@
isLastChunk = true;
}
parseBody();
+ if (maxBufferedBytes > 0 && undecodedChunk != null && undecodedChunk.readableBytes() > maxBufferedBytes) {
+ throw new ErrorDataDecoderException();
+ }
}
public boolean hasNext() throws EndOfDataDecoderException {
@@ -228,10 +258,13 @@
/**
* Utility function to add a new decoded data
*/
- private void addHttpData(InterfaceHttpData data) {
+ private void addHttpData(InterfaceHttpData data) throws ErrorDataDecoderException {
if (data == null) {
return;
}
+ if (maxFields > 0 && bodyListHttpData.size() >= maxFields) {
+ throw new ErrorDataDecoderException();
+ }
List<InterfaceHttpData> datas = bodyMapHttpData.get(data.getName());
if (datas == null) {
datas = new ArrayList<InterfaceHttpData>(1);