Fix unexpected IllegalReferenceCountException on decode multipart request. (#8575)
Motivation: Http post request may be encoded as 'multipart/form-data' without any files and consist mixed attributes only. Modifications: - Do not double release attributes - Add unit test Result: Code does not throw an IllegalReferenceCountException.
This commit is contained in:
parent
873988676a
commit
9e2922b04d
@ -931,19 +931,15 @@ public class HttpPostMultipartRequestDecoder implements InterfaceHttpPostRequest
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
checkDestroyed();
|
// Release all data items, including those not yet pulled
|
||||||
cleanFiles();
|
cleanFiles();
|
||||||
|
|
||||||
destroyed = true;
|
destroyed = true;
|
||||||
|
|
||||||
if (undecodedChunk != null && undecodedChunk.refCnt() > 0) {
|
if (undecodedChunk != null && undecodedChunk.refCnt() > 0) {
|
||||||
undecodedChunk.release();
|
undecodedChunk.release();
|
||||||
undecodedChunk = null;
|
undecodedChunk = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// release all data which was not yet pulled
|
|
||||||
for (int i = bodyListHttpDataRank; i < bodyListHttpData.size(); i++) {
|
|
||||||
bodyListHttpData.get(i).release();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -24,6 +24,7 @@ import io.netty.handler.codec.http.DefaultFullHttpRequest;
|
|||||||
import io.netty.handler.codec.http.DefaultHttpContent;
|
import io.netty.handler.codec.http.DefaultHttpContent;
|
||||||
import io.netty.handler.codec.http.DefaultHttpRequest;
|
import io.netty.handler.codec.http.DefaultHttpRequest;
|
||||||
import io.netty.handler.codec.http.DefaultLastHttpContent;
|
import io.netty.handler.codec.http.DefaultLastHttpContent;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
import io.netty.handler.codec.http.HttpContent;
|
import io.netty.handler.codec.http.HttpContent;
|
||||||
import io.netty.handler.codec.http.HttpHeaderNames;
|
import io.netty.handler.codec.http.HttpHeaderNames;
|
||||||
import io.netty.handler.codec.http.HttpHeaderValues;
|
import io.netty.handler.codec.http.HttpHeaderValues;
|
||||||
@ -689,4 +690,37 @@ public class HttpPostRequestDecoderTest {
|
|||||||
assertEquals("tmp-0.txt", fileUpload.getFilename());
|
assertEquals("tmp-0.txt", fileUpload.getFilename());
|
||||||
decoder.destroy();
|
decoder.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/netty/netty/issues/8575
|
||||||
|
@Test
|
||||||
|
public void testMultipartRequest() throws Exception {
|
||||||
|
String BOUNDARY = "01f136d9282f";
|
||||||
|
|
||||||
|
ByteBuf byteBuf = Unpooled.wrappedBuffer(("--" + BOUNDARY + "\n" +
|
||||||
|
"Content-Disposition: form-data; name=\"msg_id\"\n" +
|
||||||
|
"\n" +
|
||||||
|
"15200\n" +
|
||||||
|
"--" + BOUNDARY + "\n" +
|
||||||
|
"Content-Disposition: form-data; name=\"msg\"\n" +
|
||||||
|
"\n" +
|
||||||
|
"test message\n" +
|
||||||
|
"--" + BOUNDARY + "--").getBytes());
|
||||||
|
|
||||||
|
FullHttpRequest req = new DefaultFullHttpRequest(HttpVersion.HTTP_1_0, HttpMethod.POST, "/up", byteBuf);
|
||||||
|
req.headers().add(HttpHeaderNames.CONTENT_TYPE, "multipart/form-data; boundary=" + BOUNDARY);
|
||||||
|
|
||||||
|
HttpPostRequestDecoder decoder =
|
||||||
|
new HttpPostRequestDecoder(new DefaultHttpDataFactory(DefaultHttpDataFactory.MINSIZE),
|
||||||
|
req,
|
||||||
|
CharsetUtil.UTF_8);
|
||||||
|
|
||||||
|
assertTrue(decoder.isMultipart());
|
||||||
|
assertFalse(decoder.getBodyHttpDatas().isEmpty());
|
||||||
|
assertEquals(2, decoder.getBodyHttpDatas().size());
|
||||||
|
assertEquals("test message", ((Attribute) decoder.getBodyHttpData("msg")).getValue());
|
||||||
|
assertEquals("15200", ((Attribute) decoder.getBodyHttpData("msg_id")).getValue());
|
||||||
|
|
||||||
|
decoder.destroy();
|
||||||
|
assertEquals(1, req.refCnt());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user