aboutsummaryrefslogtreecommitdiffstats
path: root/extcap_parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'extcap_parser.c')
-rw-r--r--extcap_parser.c78
1 files changed, 52 insertions, 26 deletions
diff --git a/extcap_parser.c b/extcap_parser.c
index 411e2522be..8a5e56ad57 100644
--- a/extcap_parser.c
+++ b/extcap_parser.c
@@ -11,6 +11,7 @@
*/
#include <config.h>
+#define WS_LOG_DOMAIN LOG_DOMAIN_EXTCAP
#include <stdio.h>
#include <glib.h>
@@ -85,6 +86,12 @@ gdouble extcap_complex_get_double(extcap_complex *comp) {
return g_strtod(comp->_val, NULL);
}
+static gboolean matches_regex(const char *pattern, const char *subject) {
+ if (!g_utf8_validate(subject, -1, NULL))
+ return FALSE;
+ return g_regex_match_simple(pattern, subject, (GRegexCompileFlags) (G_REGEX_CASELESS), (GRegexMatchFlags)0);
+}
+
gboolean extcap_complex_get_bool(extcap_complex *comp) {
if (comp == NULL || comp->_val == NULL)
return FALSE;
@@ -92,7 +99,7 @@ gboolean extcap_complex_get_bool(extcap_complex *comp) {
if (comp->complex_type != EXTCAP_ARG_BOOLEAN && comp->complex_type != EXTCAP_ARG_BOOLFLAG)
return FALSE;
- return g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, comp->_val, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+ return matches_regex(EXTCAP_BOOLEAN_REGEX, comp->_val);
}
gchar *extcap_complex_get_string(extcap_complex *comp) {
@@ -107,13 +114,17 @@ static extcap_token_sentence *extcap_tokenize_sentence(const gchar *s) {
gchar *param_value = NULL;
guint param_type = EXTCAP_PARAM_UNKNOWN;
+ if (!g_utf8_validate(s, -1, NULL))
+ return FALSE;
+
extcap_token_sentence *rs = g_new0(extcap_token_sentence, 1);
rs->sentence = NULL;
/* Regex for catching just the allowed values for sentences */
if ((regex = g_regex_new("^[\\t| ]*(arg|value|interface|extcap|dlt|control)(?=[\\t| ]+\\{)",
- (GRegexCompileFlags) G_REGEX_CASELESS, (GRegexMatchFlags) 0, NULL)) != NULL) {
+ (GRegexCompileFlags) (G_REGEX_CASELESS),
+ (GRegexMatchFlags) 0, NULL)) != NULL) {
g_regex_match(regex, s, (GRegexMatchFlags) 0, &match_info);
if (g_match_info_matches(match_info))
@@ -134,7 +145,8 @@ static extcap_token_sentence *extcap_tokenize_sentence(const gchar *s) {
* that regex patterns given to {validation=} are parsed correctly,
* as long as }{ does not occur within the pattern */
regex = g_regex_new("\\{([a-zA-Z_-]*?)\\=(.*?)\\}(?=\\{|$|\\s)",
- (GRegexCompileFlags) G_REGEX_CASELESS, (GRegexMatchFlags) 0, NULL);
+ (GRegexCompileFlags) (G_REGEX_CASELESS),
+ (GRegexMatchFlags) 0, NULL);
if (regex != NULL) {
g_regex_match_full(regex, s, -1, 0, (GRegexMatchFlags) 0, &match_info, &error);
while (g_match_info_matches(match_info)) {
@@ -234,6 +246,7 @@ static void extcap_free_value(extcap_value *v) {
g_free(v->call);
g_free(v->display);
+ g_free(v->parent);
g_free(v);
}
@@ -270,24 +283,34 @@ void extcap_free_arg(extcap_arg *a) {
g_free(a);
}
-static void extcap_free_toolbar_value(iface_toolbar_value *v) {
- if (v == NULL)
+static void extcap_free_toolbar_value(iface_toolbar_value *value)
+{
+ if (value == NULL)
+ {
return;
+ }
- g_free(v->value);
- g_free(v->display);
- g_free(v);
+ g_free(value->value);
+ g_free(value->display);
+ g_free(value);
}
-static void extcap_free_toolbar_control(iface_toolbar_control *c) {
- if (c == NULL)
+void extcap_free_toolbar_control(iface_toolbar_control *control)
+{
+ if (control == NULL)
+ {
return;
+ }
- g_free(c->display);
- g_free(c->validation);
- g_free(c->tooltip);
- g_free(c->placeholder);
- g_free(c);
+ g_free(control->display);
+ g_free(control->validation);
+ g_free(control->tooltip);
+ g_free(control->placeholder);
+ if (control->ctrl_type == INTERFACE_TYPE_STRING) {
+ g_free(control->default_value.string);
+ }
+ g_list_free_full(control->values, (GDestroyNotify)extcap_free_toolbar_value);
+ g_free(control);
}
void extcap_free_arg_list(GList *a) {
@@ -374,12 +397,12 @@ static extcap_value *extcap_parse_value_sentence(extcap_token_sentence *s) {
if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_DEFAULT)))
!= NULL) {
/* printf("found default value\n"); */
- value->is_default = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+ value->is_default = matches_regex(EXTCAP_BOOLEAN_REGEX, param_value);
}
if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_ENABLED)))
!= NULL) {
- value->enabled = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+ value->enabled = matches_regex(EXTCAP_BOOLEAN_REGEX, param_value);
}
}
@@ -452,7 +475,7 @@ static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence
if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_FILE_MUSTEXIST)))
!= NULL) {
- target_arg->fileexists = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+ target_arg->fileexists = matches_regex(EXTCAP_BOOLEAN_REGEX, param_value);
}
if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_FILE_EXTENSION)))
@@ -472,7 +495,7 @@ static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence
if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_REQUIRED)))
!= NULL) {
- target_arg->is_required = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+ target_arg->is_required = matches_regex(EXTCAP_BOOLEAN_REGEX, param_value);
}
if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_TYPE)))
@@ -496,14 +519,15 @@ static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence
target_arg->arg_type = EXTCAP_ARG_BOOLFLAG;
} else if (g_ascii_strcasecmp(param_value, "selector") == 0) {
target_arg->arg_type = EXTCAP_ARG_SELECTOR;
+ } else if (g_ascii_strcasecmp(param_value, "editselector") == 0) {
+ target_arg->arg_type = EXTCAP_ARG_EDIT_SELECTOR;
} else if (g_ascii_strcasecmp(param_value, "radio") == 0) {
target_arg->arg_type = EXTCAP_ARG_RADIO;
} else if (g_ascii_strcasecmp(param_value, "string") == 0) {
target_arg->arg_type = EXTCAP_ARG_STRING;
} else if (g_ascii_strcasecmp(param_value, "password") == 0) {
+ /* Password is never saved because is mapped to PREF_PASSWORD later */
target_arg->arg_type = EXTCAP_ARG_PASSWORD;
- /* default setting is to not save passwords */
- target_arg->save = FALSE;
} else if (g_ascii_strcasecmp(param_value, "fileselect") == 0) {
target_arg->arg_type = EXTCAP_ARG_FILESELECT;
} else if (g_ascii_strcasecmp(param_value, "multicheck") == 0) {
@@ -518,12 +542,12 @@ static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence
if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_SAVE)))
!= NULL) {
- target_arg->save = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+ target_arg->save = matches_regex(EXTCAP_BOOLEAN_REGEX, param_value);
}
if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_RELOAD)))
!= NULL) {
- target_arg->reload = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+ target_arg->reload = matches_regex(EXTCAP_BOOLEAN_REGEX, param_value);
}
if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_RANGE)))
@@ -567,6 +591,8 @@ static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence
} else if (sent == EXTCAP_SENTENCE_VALUE) {
value = extcap_parse_value_sentence(s);
+ if (value == NULL)
+ return NULL;
if ((entry = g_list_find_custom(args, &value->arg_num, glist_find_numbered_arg))
== NULL) {
@@ -731,7 +757,7 @@ static iface_toolbar_control *extcap_parse_control_sentence(GList *control_items
if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_REQUIRED)))
!= NULL) {
- control->is_required = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+ control->is_required = matches_regex(EXTCAP_BOOLEAN_REGEX, param_value);
}
param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_TOOLTIP));
@@ -836,7 +862,7 @@ static iface_toolbar_control *extcap_parse_control_sentence(GList *control_items
param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_DEFAULT));
if (param_value != NULL) {
- value->is_default = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+ value->is_default = matches_regex(EXTCAP_BOOLEAN_REGEX, param_value);
}
control = (iface_toolbar_control *)entry->data;
@@ -964,7 +990,7 @@ GList *extcap_parse_dlts(gchar *output) {
}
/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
*
* Local variables:
* c-basic-offset: 4