Skip to content

Commit 6c46e85

Browse files
Fix invalid payload parsing
1 parent 265a7f2 commit 6c46e85

File tree

6 files changed

+46
-8
lines changed

6 files changed

+46
-8
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
66

77
## [Unreleased]
88

9+
### Fixed
10+
11+
- Invalid payload parsing when the message is broken.
12+
913
## [2.4.2] - 2024-01-18
1014

1115
### Added

membership/events.lua

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,17 @@ end
8484

8585
function events.unpack(event)
8686
checks('table')
87+
local payload = event[4]
88+
if payload == msgpack.NULL
89+
or type(payload) ~= 'table'
90+
then
91+
payload = nil
92+
end
8793
return {
88-
uri = event[1],
89-
status = event[2],
90-
incarnation = event[3],
91-
payload = (event[4] ~= msgpack.NULL) and event[4] or nil,
94+
uri = tostring(event[1]),
95+
status = tonumber(event[2]),
96+
incarnation = tonumber(event[3]),
97+
payload = payload,
9298
ttl = event[5],
9399
}
94100
end

membership/members.lua

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,16 @@ end
5555

5656
function members.unpack(member)
5757
checks('table')
58+
local payload = member[3]
59+
if payload == msgpack.NULL
60+
or type(payload) ~= 'table'
61+
then
62+
payload = nil
63+
end
5864
return member[1], {
59-
status = member[2],
60-
incarnation = member[3],
61-
payload = (member[4] ~= msgpack.NULL) and member[4] or nil,
65+
status = tonumber(member[2]),
66+
incarnation = tonumber(member[3]),
67+
payload = payload,
6268
}
6369
end
6470

test/instance.lua

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@ require('strict').on()
44
local log = require('log')
55
local fiber = require('fiber')
66
local console = require('console')
7+
8+
local checks = require('checks')
9+
package.loaded['checks'] = function(...)
10+
if rawget(_G, "checks_disabled") == true then
11+
return
12+
end
13+
return checks(...)
14+
end
15+
716
local membership = require('membership')
817
_G.membership = membership
918

test/test_dissemination.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def test_discover_kill(servers, helpers):
6060
t1 = time.time()
6161

6262
def check_public_opinion():
63-
""" Cheack that all members consider URI has given STATUS """
63+
""" Check that all members consider URI has given STATUS """
6464

6565
for port, srv in list(servers_copy.items()):
6666
member = srv.get_member(uri)

test/test_payload.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,16 @@ def test(servers, helpers):
3939
'foo2': 42
4040
}
4141
])
42+
43+
assert servers[13301].conn.eval('''
44+
_G.checks_disabled = true
45+
require('membership.events').generate('13301', 1, 31, 37)
46+
_G.checks_disabled = false
47+
48+
return true
49+
''')[0]
50+
helpers.wait_for(check_payload, [
51+
servers[13302],
52+
'13301',
53+
None,
54+
])

0 commit comments

Comments
 (0)