From d98f6b16ef2974454a881d8ed8ba3e0964c39e91 Mon Sep 17 00:00:00 2001 From: Zach Chadwick Date: Tue, 28 Feb 2023 10:04:37 -0500 Subject: Sharkd: Return error message on load if err!=0 Fixes a bug when the return value from load_cap_file() is nonzero. No response is currently returned causing the client to hang. A non-zero error code can happen for a variety of reasons, one of which is when the PCAP is truncated. An error message from cfile_read_failure_message() is displayed on the console, but no data was returned to the RPC client. This adds a call to wtap_strerrror() to look up a human consumable error message for the specific error code returned during wtap_read(). Adds new self-test to suite_sharkd.py --- sharkd_session.c | 10 ++++++++++ test/captures/trunc.pcap | Bin 0 -> 995 bytes test/suite_sharkd.py | 9 +++++++++ 3 files changed, 19 insertions(+) create mode 100644 test/captures/trunc.pcap diff --git a/sharkd_session.c b/sharkd_session.c index c9aa258407..7faef005f6 100644 --- a/sharkd_session.c +++ b/sharkd_session.c @@ -1087,7 +1087,17 @@ sharkd_session_process_load(const char *buf, const jsmntok_t *tokens, int count) ENDTRY; if (err == 0) + { sharkd_json_simple_ok(rpcid); + } + else + { + sharkd_json_result_prologue(rpcid); + sharkd_json_value_string("status", wtap_strerror(err)); + sharkd_json_value_anyf("err", "%d", err); + sharkd_json_result_epilogue(); + } + } /** diff --git a/test/captures/trunc.pcap b/test/captures/trunc.pcap new file mode 100644 index 0000000000..8dd75ed5ac Binary files /dev/null and b/test/captures/trunc.pcap differ diff --git a/test/suite_sharkd.py b/test/suite_sharkd.py index 4f3a8d4fcb..93b263dd50 100644 --- a/test/suite_sharkd.py +++ b/test/suite_sharkd.py @@ -70,6 +70,15 @@ class case_sharkd(subprocesstest.SubprocessTestCase): {"jsonrpc":"2.0","id":1,"error":{"code":-2001,"message":"Unable to open the file"}}, )) + def test_sharkd_req_load_truncated_pcap(self, check_sharkd_session, capture_file): + check_sharkd_session(( + {"jsonrpc":"2.0", "id":1, "method":"load", + "params":{"file": capture_file('trunc.pcap')} + }, + ), ( + {"jsonrpc":"2.0","id":1,"result":{"status":"Less data was read than was expected","err":-12}}, + )) + def test_sharkd_req_status_no_pcap(self, check_sharkd_session): check_sharkd_session(( {"jsonrpc":"2.0", "id":1, "method":"status"}, -- cgit v1.2.3