aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Perry <boolean263@protonmail.com>2020-10-21 12:33:21 -0400
committerWireshark GitLab Utility <gerald+gitlab-utility@wireshark.org>2020-12-02 20:09:55 +0000
commit27c00ca0e91d9f849477728b2c5e6f819447b137 (patch)
treeacaecf5bf75c27a2765e9b3d8a382d6fcd1fa3e6
parentf4374967bbf9c12746b8ec3cd54dddada9dd353e (diff)
Lua: make TvbRange:raw() return a subset #12046 v2
My initial fix caused several double-offset errors in TvbRange_raw() because I was adjusting for the TvbRange's offset too early in the process. The proper fix is to only adjust for it in the final call to get the data. I also simplified some of the bounds checks to be based on the values in the TvbRange instead of calling `tvb_captured_length()` and the like, because its bounds are already checked against the backing Tvb when it's first taken. Massively expanded the lua test suite to account for every combination of passing offsets and lengths to a Tvb or TvbRange and to the subsequent `:raw()` call.
-rw-r--r--epan/wslua/wslua_tvb.c26
-rw-r--r--test/lua/tvb.lua96
2 files changed, 110 insertions, 12 deletions
diff --git a/epan/wslua/wslua_tvb.c b/epan/wslua/wslua_tvb.c
index 4571dab5c3..400f6d19d4 100644
--- a/epan/wslua/wslua_tvb.c
+++ b/epan/wslua/wslua_tvb.c
@@ -1324,8 +1324,8 @@ WSLUA_METHOD TvbRange_raw(lua_State* L) {
@since 1.11.3
*/
-#define WSLUA_OPTARG_TvbRange_raw_OFFSET 2 /* The position of the first byte. Default is 0, or first byte. */
-#define WSLUA_OPTARG_TvbRange_raw_LENGTH 3 /* The length of the segment to get. Default is -1, Default is -1, or the remaining bytes. */
+#define WSLUA_OPTARG_TvbRange_raw_OFFSET 2 /* The position of the first byte within the range. Default is 0, or first byte. */
+#define WSLUA_OPTARG_TvbRange_raw_LENGTH 3 /* The length of the segment to get. Default is -1, or the remaining bytes in the range. */
TvbRange tvbr = checkTvbRange(L,1);
int offset = (int)luaL_optinteger(L,WSLUA_OPTARG_TvbRange_raw_OFFSET,0);
int len = (int)luaL_optinteger(L,WSLUA_OPTARG_TvbRange_raw_LENGTH,-1);
@@ -1336,23 +1336,27 @@ WSLUA_METHOD TvbRange_raw(lua_State* L) {
return 0;
}
- if ((guint)offset > tvb_captured_length(tvbr->tvb->ws_tvb)) {
- WSLUA_OPTARG_ERROR(TvbRange_raw,OFFSET,"offset beyond end of Tvb");
+ if (offset < 0) {
+ WSLUA_OPTARG_ERROR(TvbRange_raw,OFFSET,"offset before start of TvbRange");
+ return 0;
+ }
+ if (offset > tvbr->len) {
+ WSLUA_OPTARG_ERROR(TvbRange_raw,OFFSET,"offset beyond end of TvbRange");
return 0;
}
if (len == -1) {
- len = tvb_captured_length_remaining(tvbr->tvb->ws_tvb,offset);
- if (len < 0) {
- luaL_error(L,"out of bounds");
- return FALSE;
- }
- } else if ( (guint)(len + offset) > tvb_captured_length(tvbr->tvb->ws_tvb)) {
+ len = tvbr->len - offset;
+ }
+ if (len < 0) {
+ luaL_error(L,"out of bounds");
+ return FALSE;
+ } else if ( (len + offset) > tvbr->len) {
luaL_error(L,"Range is out of bounds");
return FALSE;
}
- lua_pushlstring(L, tvb_get_ptr(tvbr->tvb->ws_tvb, offset, len), len);
+ lua_pushlstring(L, tvb_get_ptr(tvbr->tvb->ws_tvb, tvbr->offset+offset, len), len);
WSLUA_RETURN(1); /* A Lua string of the binary bytes in the <<lua_class_TvbRange,`TvbRange`>>. */
}
diff --git a/test/lua/tvb.lua b/test/lua/tvb.lua
index 293c97d584..646e5a04cb 100644
--- a/test/lua/tvb.lua
+++ b/test/lua/tvb.lua
@@ -54,7 +54,7 @@ end
-- number of verifyFields() * (1 + number of fields) +
-- number of verifyResults() * (1 + 2 * number of values)
--
-local taptests = { [FRAME]=4, [OTHER]=337 }
+local taptests = { [FRAME]=4, [OTHER]=353 }
local function getResults()
print("\n-----------------------------\n")
@@ -883,6 +883,100 @@ function test_proto.dissector(tvbuf,pktinfo,root)
verifyResults("add_pfield-rfc1123-local", autc_match_values)
----------------------------------------
+ testing(OTHER, "TvbRange subsets")
+
+ resetResults()
+
+ local offset = 5
+ local len = 10
+ local b_offset = 3
+ local b_len = 2
+ local range
+ local range_raw
+ local expected
+
+ -- This is the same data from the "tree:add_packet_field Bytes" test
+ -- copied here for clarity
+ local bytesstring1 = "deadbeef0123456789DEADBEEFabcdef"
+ local bytestvb1 = ByteArray.new(bytesstring1, true):tvb("Bytes hex-string 1")
+
+ -- tvbrange with no offset or length (control test case)
+ range = bytestvb1()
+ range_raw = range:raw()
+ expected = range:bytes():raw()
+ execute ("tvbrange_raw", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+ range_raw = range:raw(b_offset)
+ expected = range:bytes():raw(b_offset)
+ execute ("tvbrange_raw_offset", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+ range_raw = range:raw(0, b_len)
+ expected = range:bytes():raw(0, b_len)
+ execute ("tvbrange_raw_len", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+ range_raw = range:raw(b_offset, b_len)
+ expected = range:bytes():raw(b_offset, b_len)
+ execute ("tvbrange_raw_offset_len", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+
+ -- tvbrange with len only
+ range = bytestvb1(0, len)
+ range_raw = range:raw()
+ expected = range:bytes():raw()
+ execute ("tvbrange_len_raw", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+ range_raw = range:raw(b_offset)
+ expected = range:bytes():raw(b_offset)
+ execute ("tvbrange_len_raw_offset", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+ range_raw = range:raw(0, b_len)
+ expected = range:bytes():raw(0, b_len)
+ execute ("tvbrange_len_raw_len", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+ range_raw = range:raw(b_offset, b_len)
+ expected = range:bytes():raw(b_offset, b_len)
+ execute ("tvbrange_len_raw_offset_len", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+
+ -- tvbrange with offset only
+ range = bytestvb1(offset)
+ range_raw = range:raw()
+ expected = range:bytes():raw()
+ execute ("tvbrange_offset_raw", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+ range_raw = range:raw(b_offset)
+ expected = range:bytes():raw(b_offset)
+ execute ("tvbrange_offset_raw_offset", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+ range_raw = range:raw(0, b_len)
+ expected = range:bytes():raw(0, b_len)
+ execute ("tvbrange_offset_raw_len", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+ range_raw = range:raw(b_offset, b_len)
+ expected = range:bytes():raw(b_offset, b_len)
+ execute ("tvbrange_offset_raw_offset_len", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+
+ -- tvbrange with offset and len
+ range = bytestvb1(offset, len)
+ range_raw = range:raw()
+ expected = range:bytes():raw()
+ execute ("tvbrange_offset_len_raw", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+ range_raw = range:raw(b_offset)
+ expected = range:bytes():raw(b_offset)
+ execute ("tvbrange_offset_len_raw_offset", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+ range_raw = range:raw(0, b_len)
+ expected = range:bytes():raw(0, b_len)
+ execute ("tvbrange_offset_len_raw_len", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+ range_raw = range:raw(b_offset, b_len)
+ expected = range:bytes():raw(b_offset, b_len)
+ execute ("tvbrange_offset_len_raw_offset_len", range_raw == expected,
+ string.format('range_raw="%s" expected="%s"', range_raw, expected))
+
+----------------------------------------
setPassed(FRAME)
end