aboutsummaryrefslogtreecommitdiffstats
path: root/tshark.c
diff options
context:
space:
mode:
authorJoão Valverde <j@v6e.pt>2022-04-11 16:07:13 +0100
committerJoão Valverde <joao.valverde@tecnico.ulisboa.pt>2022-04-11 21:03:06 +0000
commit2f02cd6e19ec8d0cfcb24942052ec133a183dbf3 (patch)
treef6a118243fc3b61a8f307acc9de4d0abead702df /tshark.c
parentceef8aa8eebf7d94318d315ba3782bd1aab15fce (diff)
dfilter: Handle missing error location more gracefully
If we don't have an offset, don't print anything with underline. Also it can underline filters using macros correctly now. $ tshark -Y 'ip and ${private_ipv4:ip.sr}' -r /dev/null tshark: Left side of "==" expression must be a field or function, not "ip.sr". ip and ip.sr == 192.168.0.0/16 or ip.sr == 172.16.0.0/12 or ip.sr == 10.0.0.0/8 ^~~~~
Diffstat (limited to 'tshark.c')
-rw-r--r--tshark.c51
1 files changed, 37 insertions, 14 deletions
diff --git a/tshark.c b/tshark.c
index 012c6ded3d..09686ecefa 100644
--- a/tshark.c
+++ b/tshark.c
@@ -606,6 +606,40 @@ gather_tshark_runtime_info(feature_list l)
epan_gather_runtime_info(l);
}
+static gboolean
+_compile_dfilter(const char *text, dfilter_t **dfp, const char *caller)
+{
+ gboolean ok;
+ dfilter_loc_t err_loc;
+ char *err_msg = NULL;
+ char *err_off;
+ char *expanded;
+
+ expanded = dfilter_expand(text, &err_msg);
+ if (expanded == NULL) {
+ cmdarg_err("%s", err_msg);
+ g_free(err_msg);
+ return FALSE;
+ }
+
+ ok = dfilter_compile_real(expanded, dfp, &err_msg, &err_loc, caller, FALSE, FALSE);
+ if (!ok ) {
+ cmdarg_err("%s", err_msg);
+ g_free(err_msg);
+ if (err_loc.col_start >= 0) {
+ err_off = ws_strdup_error_offset(NULL, err_loc.col_start, err_loc.col_len);
+ cmdarg_err_cont(" %s", expanded);
+ cmdarg_err_cont(" %s", err_off);
+ g_free(err_off);
+ }
+ }
+
+ g_free(expanded);
+ return ok;
+}
+
+#define compile_dfilter(text, dfp) _compile_dfilter(text, dfp, __func__)
+
static void
about_folders(void)
{
@@ -722,7 +756,7 @@ must_do_dissection(dfilter_t *rfcode, dfilter_t *dfcode,
int
main(int argc, char *argv[])
{
- char *err_msg, *err_msg_cont;
+ char *err_msg;
static const struct report_message_routines tshark_report_routines = {
failure_message,
failure_message,
@@ -777,7 +811,6 @@ main(int argc, char *argv[])
gchar *volatile dfilter = NULL;
dfilter_t *rfcode = NULL;
dfilter_t *dfcode = NULL;
- dfilter_loc_t df_loc;
e_prefs *prefs_p;
gchar *output_only = NULL;
gchar *volatile pdu_export_arg = NULL;
@@ -2014,12 +2047,7 @@ main(int argc, char *argv[])
if (rfilter != NULL) {
ws_debug("Compiling read filter: '%s'", rfilter);
- if (!dfilter_compile2(rfilter, &rfcode, &err_msg, &df_loc)) {
- cmdarg_err("%s", err_msg);
- err_msg_cont = ws_strdup_error_offset(NULL, df_loc.col_start, df_loc.col_len);
- cmdarg_err_cont(" %s\n %s\n", rfilter, err_msg_cont);
- g_free(err_msg);
- g_free(err_msg_cont);
+ if (!compile_dfilter(rfilter, &rfcode)) {
epan_cleanup();
extcap_cleanup();
@@ -2044,12 +2072,7 @@ main(int argc, char *argv[])
if (dfilter != NULL) {
ws_debug("Compiling display filter: '%s'", dfilter);
- if (!dfilter_compile2(dfilter, &dfcode, &err_msg, &df_loc)) {
- cmdarg_err("%s", err_msg);
- err_msg_cont = ws_strdup_error_offset(NULL, df_loc.col_start, df_loc.col_len);
- cmdarg_err_cont(" %s\n %s\n", dfilter, err_msg_cont);
- g_free(err_msg);
- g_free(err_msg_cont);
+ if (!compile_dfilter(dfilter, &dfcode)) {
epan_cleanup();
extcap_cleanup();