Decompression limit
- there is now a configurable decompression limit, default at 1MB. Oversize messages are trated as if they never arrived, just a log entry
This commit is contained in:
parent
9f4a1fa0a4
commit
183f509f09
|
@ -28,7 +28,6 @@ import tr
|
||||||
from debug import logger
|
from debug import logger
|
||||||
import l10n
|
import l10n
|
||||||
|
|
||||||
|
|
||||||
class objectProcessor(threading.Thread):
|
class objectProcessor(threading.Thread):
|
||||||
"""
|
"""
|
||||||
The objectProcessor thread, of which there is only one, receives network
|
The objectProcessor thread, of which there is only one, receives network
|
||||||
|
@ -71,6 +70,8 @@ class objectProcessor(threading.Thread):
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
logger.critical('Error! Bug! The class_objectProcessor was passed an object type it doesn\'t recognize: %s' % str(objectType))
|
logger.critical('Error! Bug! The class_objectProcessor was passed an object type it doesn\'t recognize: %s' % str(objectType))
|
||||||
|
except helper_msgcoding.DecompressionSizeException as e:
|
||||||
|
logger.error("The object is too big after decompression (stopped decompressing at %ib, your configured limit %ib). Ignoring", e.size, BMConfigParser().safeGetInt("zlib", "maxsize"))
|
||||||
except varintDecodeError as e:
|
except varintDecodeError as e:
|
||||||
logger.debug("There was a problem with a varint while processing an object. Some details: %s" % e)
|
logger.debug("There was a problem with a varint while processing an object. Some details: %s" % e)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
|
@ -7,6 +7,7 @@ except ImportError:
|
||||||
import string
|
import string
|
||||||
import zlib
|
import zlib
|
||||||
|
|
||||||
|
from bmconfigparser import BMConfigParser
|
||||||
import shared
|
import shared
|
||||||
from debug import logger
|
from debug import logger
|
||||||
import messagetypes
|
import messagetypes
|
||||||
|
@ -17,6 +18,10 @@ BITMESSAGE_ENCODING_TRIVIAL = 1
|
||||||
BITMESSAGE_ENCODING_SIMPLE = 2
|
BITMESSAGE_ENCODING_SIMPLE = 2
|
||||||
BITMESSAGE_ENCODING_EXTENDED = 3
|
BITMESSAGE_ENCODING_EXTENDED = 3
|
||||||
|
|
||||||
|
class DecompressionSizeException(Exception):
|
||||||
|
def __init__(self, size):
|
||||||
|
self.size = size
|
||||||
|
|
||||||
|
|
||||||
class MsgEncode(object):
|
class MsgEncode(object):
|
||||||
def __init__(self, message, encoding=BITMESSAGE_ENCODING_SIMPLE):
|
def __init__(self, message, encoding=BITMESSAGE_ENCODING_SIMPLE):
|
||||||
|
@ -65,11 +70,24 @@ class MsgDecode(object):
|
||||||
self.subject = _translate("MsgDecode", "Unknown encoding")
|
self.subject = _translate("MsgDecode", "Unknown encoding")
|
||||||
|
|
||||||
def decodeExtended(self, data):
|
def decodeExtended(self, data):
|
||||||
|
dc = zlib.decompressobj()
|
||||||
|
tmp = ""
|
||||||
|
while len(tmp) <= BMConfigParser().safeGetInt("zlib", "maxsize"):
|
||||||
|
try:
|
||||||
|
got = dc.decompress(data, BMConfigParser().safeGetInt("zlib", "maxsize") + 1 - len(tmp))
|
||||||
|
# EOF
|
||||||
|
if got == "":
|
||||||
|
break
|
||||||
|
tmp += got
|
||||||
|
data = dc.unconsumed_tail
|
||||||
|
except zlib.error:
|
||||||
|
logger.error("Error decompressing message")
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
raise DecompressionSizeException(len(tmp))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
tmp = msgpack.loads(zlib.decompress(data))
|
tmp = msgpack.loads(tmp)
|
||||||
except zlib.error:
|
|
||||||
logger.error("Error decompressing message")
|
|
||||||
raise
|
|
||||||
except (msgpack.exceptions.UnpackException,
|
except (msgpack.exceptions.UnpackException,
|
||||||
msgpack.exceptions.ExtraData):
|
msgpack.exceptions.ExtraData):
|
||||||
logger.error("Error msgunpacking message")
|
logger.error("Error msgunpacking message")
|
||||||
|
|
Reference in New Issue
Block a user