Skip to content

Commit cfd6ccd

Browse files
authored
Merge pull request #52 from sunshine2050/fix-malformed-messages
Handling malformed messages
2 parents c156d78 + f7a8656 commit cfd6ccd

3 files changed

Lines changed: 42 additions & 2 deletions

File tree

dlt/core/core_base.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,15 @@ def use_extended_header(self):
211211
"""Returns True if the DLTMessage has extended header"""
212212
return self.standardheader.htyp & DLT_HTYP_UEH
213213

214+
@property
215+
def _is_extended_header_exists(self):
216+
return self.extendedheader and self.extendedheader.msin
217+
214218
@property
215219
def is_mode_verbose(self):
216220
"""Returns True if the DLTMessage is set to verbose mode"""
221+
if not self._is_extended_header_exists:
222+
return self.verbose
217223
return self.extendedheader.msin & DLT_MSIN_VERB
218224

219225
@property
@@ -290,6 +296,8 @@ def ctrl_return_type_string(self):
290296
@property
291297
def type(self):
292298
"""Returns message type of the DLTMessage"""
299+
if not self._is_extended_header_exists:
300+
return DLT_TYPE_LOG
293301
return (self.extendedheader.msin & DLT_MSIN_MSTP) >> DLT_MSIN_MSTP_SHIFT
294302

295303
@property
@@ -301,6 +309,8 @@ def type_string(self):
301309
@property
302310
def subtype(self):
303311
"""Returns message subtype of the DLTMessage"""
312+
if not self._is_extended_header_exists:
313+
return DLT_TYPE_LOG
304314
return (self.extendedheader.msin & DLT_MSIN_MTIN) >> DLT_MSIN_MTIN_SHIFT
305315

306316
@property
@@ -329,7 +339,7 @@ def payload_decoded(self):
329339
"""
330340
text = b""
331341
if self.is_mode_non_verbose and not self.is_type_control and self.noar == 0:
332-
buf = ctypes.create_string_buffer("\000" * DLT_DAEMON_TEXTSIZE)
342+
buf = ctypes.create_string_buffer(b"\000" * DLT_DAEMON_TEXTSIZE)
333343
dltlib.dlt_message_payload(ctypes.byref(self), buf, DLT_DAEMON_TEXTSIZE, DLT_OUTPUT_ASCII, self.verbose)
334344
return b"[%s] #%s#" % (self.message_id_string, buf.value[4:].rstrip(b"\000"))
335345

tests/dlt_message_unit_test.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,25 @@
88
import pytest
99

1010
from dlt.dlt import DLTMessage
11-
from tests.utils import create_messages, stream_one, stream_with_params, stream_multiple, msg_benoit, control_one
11+
from tests.utils import (
12+
create_messages,
13+
stream_one,
14+
stream_with_params,
15+
stream_multiple,
16+
stream_multiple_with_malformed_message_at_begining,
17+
msg_benoit,
18+
control_one,
19+
)
1220

1321

1422
class TestsDLTMessageUnit(object):
23+
def test_malformed_message(self):
24+
msgs = create_messages(stream_multiple_with_malformed_message_at_begining, from_file=True)
25+
26+
assert msgs[0].message_id == 1279675715
27+
assert len(msgs) == 3
28+
assert not msgs[0].extendedheader
29+
1530
def test_compare_default_attrs(self):
1631
attrs = {"extendedheader.apid": "DA1", "extendedheader.ctid": "DC1"}
1732
msg = create_messages(stream_one)

tests/utils.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212

1313
stream_one = io.BytesIO(b"5\x00\x00 MGHS\xdd\xf6e\xca&\x01DA1\x00DC1\x00\x02\x0f\x00\x00\x00\x02\x00\x00\x00\x00")
14+
1415
stream_with_params = (
1516
b"DLT\x01\xc2<\x85W\xc7\xc5\x02\x00MGHS=r\x00\xa0MGHS\x00\x00\x02B\x00X\xd4\xf1A\x08"
1617
b"ENV\x00LVLM\x00\x02\x00\x00-\x00CLevelMonitor::notification() => commandType\x00#"
@@ -30,6 +31,20 @@
3031
b" currently available 3.7G of space).\nEnforced usage limit is thus 385.9M.\x00"
3132
)
3233

34+
stream_multiple_with_malformed_message_at_begining = (
35+
b"DLT\x01\xfar\xc5c\xf7j\x03\x00\x00\x00\x00\x00\x00\x00\x00LCMFLOW WUP invalidDLT\x01"
36+
b"\xfar\xc5c\x0bo\x03\x00XORA'\x01\x00\x1bXORA\x16\x02\x00\x00\x00\x00\x00\x00\x00"
37+
b"\x00\x00\x00\x00\x11\x04\x00\x00\x00\x00DLT\x01\xfar\xc5c?o\x03"
38+
b"DLT\x01#o\xd1WD>\x0c\x00MGHS5\x00\x00YMGHS\x00\x01\x80\xd1&\x01DA1\x00DC1\x00\x03\x00\x00\x00"
39+
b"\x07\x01\x00SYS\x00\x01\x00FILE\xff\xff\x16\x00File transfer manager.\x12\x00"
40+
b"DLT System ManagerremoDLT\x01#o\xd1Wo>\x0c\x00MGHS=\x00\x01PMGHS\x00\x00\x03\xf4\x00"
41+
b"\x01i\xa6A\x05SYS\x00JOUR\x00\x02\x00\x00\x1b\x002011/11/11 11:11:18.005274\x00\x00\x02\x00\x00"
42+
b"\t\x006.005274\x00\x00\x02\x00\x00\x16\x00systemd-journal[748]:\x00\x00\x02\x00\x00\x0f\x00"
43+
b"Informational:\x00\x00\x02\x00\x00\xcf\x00Runtime journal (/run/log/journal/) is currently"
44+
b" using 8.0M.\nMaximum allowed usage is set to 385.9M.\nLeaving at least 578.8M free (of"
45+
b" currently available 3.7G of space).\nEnforced usage limit is thus 385.9M.\x00"
46+
)
47+
3348
msg_benoit = (
3449
b"DLT\x01\xa5\xd1\xceW\x90\xb9\r\x00MGHS=\x00\x00RMGHS\x00\x00\n[\x00\x0f\x9b#A\x01DEMODATA\x00"
3550
b"\x82\x00\x002\x00Logging from the constructor of a global instance\x00"

0 commit comments

Comments
 (0)