protect against internal transport requests that are malformed or wrongly sending HTTP requests to the transport port that can cause OOM (though really, that OOM is harmless in this case), relates to #1955.
This commit is contained in:
parent
2ea77782a1
commit
e50fffdaeb
|
@ -25,12 +25,15 @@ import org.elasticsearch.common.io.stream.HandlesStreamInput;
|
||||||
import org.elasticsearch.common.io.stream.StreamInput;
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
import org.elasticsearch.common.io.stream.Streamable;
|
import org.elasticsearch.common.io.stream.Streamable;
|
||||||
import org.elasticsearch.common.logging.ESLogger;
|
import org.elasticsearch.common.logging.ESLogger;
|
||||||
|
import org.elasticsearch.common.unit.ByteSizeValue;
|
||||||
|
import org.elasticsearch.monitor.jvm.JvmInfo;
|
||||||
import org.elasticsearch.threadpool.ThreadPool;
|
import org.elasticsearch.threadpool.ThreadPool;
|
||||||
import org.elasticsearch.transport.*;
|
import org.elasticsearch.transport.*;
|
||||||
import org.elasticsearch.transport.support.TransportStreams;
|
import org.elasticsearch.transport.support.TransportStreams;
|
||||||
import org.jboss.netty.buffer.ChannelBuffer;
|
import org.jboss.netty.buffer.ChannelBuffer;
|
||||||
import org.jboss.netty.buffer.ChannelBuffers;
|
import org.jboss.netty.buffer.ChannelBuffers;
|
||||||
import org.jboss.netty.channel.*;
|
import org.jboss.netty.channel.*;
|
||||||
|
import org.jboss.netty.handler.codec.frame.TooLongFrameException;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StreamCorruptedException;
|
import java.io.StreamCorruptedException;
|
||||||
|
@ -52,6 +55,8 @@ public class MessageChannelHandler extends SimpleChannelUpstreamHandler {
|
||||||
// from FrameDecoder
|
// from FrameDecoder
|
||||||
private ChannelBuffer cumulation;
|
private ChannelBuffer cumulation;
|
||||||
|
|
||||||
|
private static final long NINETY_PER_HEAP_SIZE = (long) (JvmInfo.jvmInfo().mem().heapMax().bytes() * 0.9);
|
||||||
|
|
||||||
public MessageChannelHandler(NettyTransport transport, ESLogger logger) {
|
public MessageChannelHandler(NettyTransport transport, ESLogger logger) {
|
||||||
this.threadPool = transport.threadPool();
|
this.threadPool = transport.threadPool();
|
||||||
this.transportServiceAdapter = transport.transportServiceAdapter();
|
this.transportServiceAdapter = transport.transportServiceAdapter();
|
||||||
|
@ -130,6 +135,11 @@ public class MessageChannelHandler extends SimpleChannelUpstreamHandler {
|
||||||
if (dataLen <= 0) {
|
if (dataLen <= 0) {
|
||||||
throw new StreamCorruptedException("invalid data length: " + dataLen);
|
throw new StreamCorruptedException("invalid data length: " + dataLen);
|
||||||
}
|
}
|
||||||
|
// safety against too large frames being sent
|
||||||
|
if (dataLen > NINETY_PER_HEAP_SIZE) {
|
||||||
|
throw new TooLongFrameException(
|
||||||
|
"transport content length received [" + new ByteSizeValue(dataLen) + "] exceeded [" + new ByteSizeValue(NINETY_PER_HEAP_SIZE) + "]");
|
||||||
|
}
|
||||||
|
|
||||||
actualSize = dataLen + 4;
|
actualSize = dataLen + 4;
|
||||||
if (buffer.readableBytes() < actualSize) {
|
if (buffer.readableBytes() < actualSize) {
|
||||||
|
|
Loading…
Reference in New Issue