From 6c44f2017c891e15045fca5c5cff79acd48ad4e5 Mon Sep 17 00:00:00 2001 From: Michael Mann Date: Fri, 26 May 2017 07:52:17 -0400 Subject: Qt: Add support to verify extcap capture filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: 11668 Change-Id: Ib218d87c1905e53ffdab4e3dd6f93ba2c3d07c8b Reviewed-on: https://code.wireshark.org/review/21770 Petri-Dish: Stig Bjørlykke Tested-by: Petri Dish Buildbot Reviewed-by: Michael Mann Reviewed-by: Roland Knall --- ui/qt/capture_filter_syntax_worker.cpp | 39 ++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) (limited to 'ui') diff --git a/ui/qt/capture_filter_syntax_worker.cpp b/ui/qt/capture_filter_syntax_worker.cpp index 83f9b13375..0a0733aff5 100644 --- a/ui/qt/capture_filter_syntax_worker.cpp +++ b/ui/qt/capture_filter_syntax_worker.cpp @@ -29,6 +29,9 @@ #include "capture_opts.h" #include "ui/capture_globals.h" #endif +#ifdef HAVE_EXTCAP +#include "extcap.h" +#endif #include "capture_filter_syntax_worker.h" #include "syntax_line_edit.h" @@ -60,6 +63,9 @@ void CaptureFilterSyntaxWorker::start() { forever { QString filter; QSet active_dlts; +#ifdef HAVE_EXTCAP + QSet active_extcap; +#endif struct bpf_program fcode; pcap_t *pd; int pc_err; @@ -88,8 +94,7 @@ void CaptureFilterSyntaxWorker::start() { device = g_array_index(global_capture_opts.all_ifaces, interface_t, if_idx); if (!device.locked && device.selected) { #ifdef HAVE_EXTCAP - if (device.if_info.extcap == NULL || strlen(device.if_info.extcap) == 0) - { + if (device.if_info.extcap == NULL || strlen(device.if_info.extcap) == 0) { #endif if (device.active_dlt >= DLT_USER0 && device.active_dlt <= DLT_USER15) { // Capture filter for DLT_USER is unknown @@ -99,10 +104,8 @@ void CaptureFilterSyntaxWorker::start() { active_dlts.insert(device.active_dlt); } #ifdef HAVE_EXTCAP - } - else - { - //TODO: Verify extcap capture file (bug 11668) + } else { + active_extcap.insert(if_idx); } #endif } @@ -139,6 +142,30 @@ void CaptureFilterSyntaxWorker::start() { if (state == SyntaxLineEdit::Invalid) break; } +#ifdef HAVE_EXTCAP + // If it's already invalid, don't bother to check extcap + if (state != SyntaxLineEdit::Invalid) { + foreach (guint extcapif, active_extcap.toList()) { + interface_t device; + gchar *error = NULL; + + device = g_array_index(global_capture_opts.all_ifaces, interface_t, extcapif); + extcap_filter_status status = extcap_verify_capture_filter(device.name, filter.toUtf8().constData(), &error); + if (status == EXTCAP_FILTER_VALID) { + DEBUG_SYNTAX_CHECK("unknown", "known good"); + } else if (status == EXTCAP_FILTER_INVALID) { + DEBUG_SYNTAX_CHECK("unknown", "known bad"); + state = SyntaxLineEdit::Invalid; + err_str = error; + break; + } else { + state = SyntaxLineEdit::Deprecated; + err_str = "Unable to check capture filter"; + } + g_free (error); + } + } +#endif emit syntaxResult(filter, state, err_str); DEBUG_SYNTAX_CHECK("known", "idle"); -- cgit v1.2.1