forked from osmocom/wireshark
Report syntax errors in UAT prefs parsing
Add the cause for a syntax error while parsing UATs. Example output: $ tshark -ouat:ssl_keys:, tshark: Invalid -o flag "uat:ssl_keys:,": ssl_keys:1: No IP address given. $ tshark -ouat:unknown:, tshark: Invalid -o flag "uat:unknown:,": Unknown preference Change-Id: I549406c4e31a81d29f487ef47bdb3c22da084947 Reviewed-on: https://code.wireshark.org/review/21748 Petri-Dish: Peter Wu <peter@lekensteyn.nl> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Jakub Zawadzki <darkjames-ws@darkjames.pl> Reviewed-by: Michael Mann <mmann78@netscape.net>
This commit is contained in:
parent
940165933f
commit
c9b0e9c813
13
epan/prefs.c
13
epan/prefs.c
|
@ -4510,10 +4510,9 @@ read_prefs_file(const char *pf_path, FILE *pf,
|
||||||
* a valid uat entry.
|
* a valid uat entry.
|
||||||
*/
|
*/
|
||||||
static gboolean
|
static gboolean
|
||||||
prefs_set_uat_pref(char *uat_entry) {
|
prefs_set_uat_pref(char *uat_entry, char **errmsg) {
|
||||||
gchar *p, *colonp;
|
gchar *p, *colonp;
|
||||||
uat_t *uat;
|
uat_t *uat;
|
||||||
gchar *err = NULL;
|
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
|
|
||||||
colonp = strchr(uat_entry, ':');
|
colonp = strchr(uat_entry, ':');
|
||||||
|
@ -4543,11 +4542,11 @@ prefs_set_uat_pref(char *uat_entry) {
|
||||||
uat = uat_find(uat_entry);
|
uat = uat_find(uat_entry);
|
||||||
*colonp = ':';
|
*colonp = ':';
|
||||||
if (uat == NULL) {
|
if (uat == NULL) {
|
||||||
|
*errmsg = g_strdup("Unknown preference");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = uat_load_str(uat, p, &err);
|
ret = uat_load_str(uat, p, errmsg);
|
||||||
g_free(err);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4558,7 +4557,7 @@ prefs_set_uat_pref(char *uat_entry) {
|
||||||
* in some fashion.
|
* in some fashion.
|
||||||
*/
|
*/
|
||||||
prefs_set_pref_e
|
prefs_set_pref_e
|
||||||
prefs_set_pref(char *prefarg)
|
prefs_set_pref(char *prefarg, char **errmsg)
|
||||||
{
|
{
|
||||||
gchar *p, *colonp;
|
gchar *p, *colonp;
|
||||||
prefs_set_pref_e ret;
|
prefs_set_pref_e ret;
|
||||||
|
@ -4573,6 +4572,8 @@ prefs_set_pref(char *prefarg)
|
||||||
mgcp_tcp_port_count = -1;
|
mgcp_tcp_port_count = -1;
|
||||||
mgcp_udp_port_count = -1;
|
mgcp_udp_port_count = -1;
|
||||||
|
|
||||||
|
*errmsg = NULL;
|
||||||
|
|
||||||
colonp = strchr(prefarg, ':');
|
colonp = strchr(prefarg, ':');
|
||||||
if (colonp == NULL)
|
if (colonp == NULL)
|
||||||
return PREFS_SET_SYNTAX_ERR;
|
return PREFS_SET_SYNTAX_ERR;
|
||||||
|
@ -4599,7 +4600,7 @@ prefs_set_pref(char *prefarg)
|
||||||
if (strcmp(prefarg, "uat")) {
|
if (strcmp(prefarg, "uat")) {
|
||||||
ret = set_pref(prefarg, p, NULL, TRUE);
|
ret = set_pref(prefarg, p, NULL, TRUE);
|
||||||
} else {
|
} else {
|
||||||
ret = prefs_set_uat_pref(p) ? PREFS_SET_OK : PREFS_SET_SYNTAX_ERR;
|
ret = prefs_set_uat_pref(p, errmsg) ? PREFS_SET_OK : PREFS_SET_SYNTAX_ERR;
|
||||||
}
|
}
|
||||||
*colonp = ':'; /* put the colon back */
|
*colonp = ':'; /* put the colon back */
|
||||||
return ret;
|
return ret;
|
||||||
|
|
21
epan/prefs.h
21
epan/prefs.h
|
@ -575,14 +575,8 @@ extern e_prefs *read_prefs(void);
|
||||||
into "*pf_path_return", and return the errno. */
|
into "*pf_path_return", and return the errno. */
|
||||||
WS_DLL_PUBLIC int write_prefs(char **);
|
WS_DLL_PUBLIC int write_prefs(char **);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Given a string of the form "<pref name>:<pref value>", as might appear
|
* Result of setting a preference.
|
||||||
* as an argument to a "-o" option, parse it and set the preference in
|
|
||||||
* question. Return an indication of whether it succeeded or failed
|
|
||||||
* in some fashion.
|
|
||||||
*
|
|
||||||
* XXX - should supply, for syntax errors, a detailed explanation of
|
|
||||||
* the syntax error.
|
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
PREFS_SET_OK, /* succeeded */
|
PREFS_SET_OK, /* succeeded */
|
||||||
|
@ -591,7 +585,16 @@ typedef enum {
|
||||||
PREFS_SET_OBSOLETE /* preference used to exist but no longer does */
|
PREFS_SET_OBSOLETE /* preference used to exist but no longer does */
|
||||||
} prefs_set_pref_e;
|
} prefs_set_pref_e;
|
||||||
|
|
||||||
WS_DLL_PUBLIC prefs_set_pref_e prefs_set_pref(char *prefarg);
|
/*
|
||||||
|
* Given a string of the form "<pref name>:<pref value>", as might appear
|
||||||
|
* as an argument to a "-o" option, parse it and set the preference in
|
||||||
|
* question. Return an indication of whether it succeeded or failed
|
||||||
|
* in some fashion.
|
||||||
|
*
|
||||||
|
* For syntax errors (return value PREFS_SET_SYNTAX_ERR), details (when
|
||||||
|
* available) are written into "errmsg" which must be freed with g_free.
|
||||||
|
*/
|
||||||
|
WS_DLL_PUBLIC prefs_set_pref_e prefs_set_pref(char *prefarg, char **errmsg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get or set a preference's obsolete status. These can be used to make a
|
* Get or set a preference's obsolete status. These can be used to make a
|
||||||
|
|
14
rawshark.c
14
rawshark.c
|
@ -370,6 +370,7 @@ set_link_type(const char *lt_arg) {
|
||||||
long val;
|
long val;
|
||||||
dissector_handle_t dhandle;
|
dissector_handle_t dhandle;
|
||||||
GString *pref_str;
|
GString *pref_str;
|
||||||
|
char *errmsg = NULL;
|
||||||
|
|
||||||
if (!spec_ptr)
|
if (!spec_ptr)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -410,8 +411,9 @@ set_link_type(const char *lt_arg) {
|
||||||
g_string_append_printf(pref_str,
|
g_string_append_printf(pref_str,
|
||||||
"\"User 0 (DLT=147)\",\"%s\",\"0\",\"\",\"0\",\"\"",
|
"\"User 0 (DLT=147)\",\"%s\",\"0\",\"\",\"0\",\"\"",
|
||||||
spec_ptr);
|
spec_ptr);
|
||||||
if (prefs_set_pref(pref_str->str) != PREFS_SET_OK) {
|
if (prefs_set_pref(pref_str->str, &errmsg) != PREFS_SET_OK) {
|
||||||
g_string_free(pref_str, TRUE);
|
g_string_free(pref_str, TRUE);
|
||||||
|
g_free(errmsg);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
g_string_free(pref_str, TRUE);
|
g_string_free(pref_str, TRUE);
|
||||||
|
@ -620,13 +622,18 @@ main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'o': /* Override preference from command line */
|
case 'o': /* Override preference from command line */
|
||||||
switch (prefs_set_pref(optarg)) {
|
{
|
||||||
|
char *errmsg = NULL;
|
||||||
|
|
||||||
|
switch (prefs_set_pref(optarg, &errmsg)) {
|
||||||
|
|
||||||
case PREFS_SET_OK:
|
case PREFS_SET_OK:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PREFS_SET_SYNTAX_ERR:
|
case PREFS_SET_SYNTAX_ERR:
|
||||||
cmdarg_err("Invalid -o flag \"%s\"", optarg);
|
cmdarg_err("Invalid -o flag \"%s\"%s%s", optarg,
|
||||||
|
errmsg ? ": " : "", errmsg ? errmsg : "");
|
||||||
|
g_free(errmsg);
|
||||||
ret = INVALID_OPTION;
|
ret = INVALID_OPTION;
|
||||||
goto clean_exit;
|
goto clean_exit;
|
||||||
break;
|
break;
|
||||||
|
@ -639,6 +646,7 @@ main(int argc, char *argv[])
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 'p': /* Expect pcap_pkthdr packet headers, which may have 64-bit timestamps */
|
case 'p': /* Expect pcap_pkthdr packet headers, which may have 64-bit timestamps */
|
||||||
want_pcap_pkthdr = TRUE;
|
want_pcap_pkthdr = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -3073,6 +3073,7 @@ sharkd_session_process_setconf(char *buf, const jsmntok_t *tokens, int count)
|
||||||
const char *tok_name = json_find_attr(buf, tokens, count, "name");
|
const char *tok_name = json_find_attr(buf, tokens, count, "name");
|
||||||
const char *tok_value = json_find_attr(buf, tokens, count, "value");
|
const char *tok_value = json_find_attr(buf, tokens, count, "value");
|
||||||
char pref[4096];
|
char pref[4096];
|
||||||
|
char *errmsg = NULL;
|
||||||
|
|
||||||
prefs_set_pref_e ret;
|
prefs_set_pref_e ret;
|
||||||
|
|
||||||
|
@ -3081,8 +3082,15 @@ sharkd_session_process_setconf(char *buf, const jsmntok_t *tokens, int count)
|
||||||
|
|
||||||
ws_snprintf(pref, sizeof(pref), "%s:%s", tok_name, tok_value);
|
ws_snprintf(pref, sizeof(pref), "%s:%s", tok_name, tok_value);
|
||||||
|
|
||||||
ret = prefs_set_pref(pref);
|
ret = prefs_set_pref(pref, &errmsg);
|
||||||
printf("{\"err\":%d}\n", ret);
|
printf("{\"err\":%d", ret);
|
||||||
|
if (errmsg) {
|
||||||
|
/* Add error message for some syntax errors. */
|
||||||
|
printf(",\"errmsg\":");
|
||||||
|
json_puts_string(errmsg);
|
||||||
|
}
|
||||||
|
printf("}\n");
|
||||||
|
g_free(errmsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sharkd_session_process_dumpconf_data
|
struct sharkd_session_process_dumpconf_data
|
||||||
|
|
10
tfshark.c
10
tfshark.c
|
@ -689,13 +689,18 @@ main(int argc, char *argv[])
|
||||||
line_buffered = TRUE;
|
line_buffered = TRUE;
|
||||||
break;
|
break;
|
||||||
case 'o': /* Override preference from command line */
|
case 'o': /* Override preference from command line */
|
||||||
switch (prefs_set_pref(optarg)) {
|
{
|
||||||
|
char *errmsg = NULL;
|
||||||
|
|
||||||
|
switch (prefs_set_pref(optarg, &errmsg)) {
|
||||||
|
|
||||||
case PREFS_SET_OK:
|
case PREFS_SET_OK:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PREFS_SET_SYNTAX_ERR:
|
case PREFS_SET_SYNTAX_ERR:
|
||||||
cmdarg_err("Invalid -o flag \"%s\"", optarg);
|
cmdarg_err("Invalid -o flag \"%s\"%s%s", optarg,
|
||||||
|
errmsg ? ": " : "", errmsg ? errmsg : "");
|
||||||
|
g_free(errmsg);
|
||||||
return 1;
|
return 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -707,6 +712,7 @@ main(int argc, char *argv[])
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 'q': /* Quiet */
|
case 'q': /* Quiet */
|
||||||
quiet = TRUE;
|
quiet = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
10
tshark.c
10
tshark.c
|
@ -1208,13 +1208,18 @@ main(int argc, char *argv[])
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case 'o': /* Override preference from command line */
|
case 'o': /* Override preference from command line */
|
||||||
switch (prefs_set_pref(optarg)) {
|
{
|
||||||
|
char *errmsg = NULL;
|
||||||
|
|
||||||
|
switch (prefs_set_pref(optarg, &errmsg)) {
|
||||||
|
|
||||||
case PREFS_SET_OK:
|
case PREFS_SET_OK:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PREFS_SET_SYNTAX_ERR:
|
case PREFS_SET_SYNTAX_ERR:
|
||||||
cmdarg_err("Invalid -o flag \"%s\"", optarg);
|
cmdarg_err("Invalid -o flag \"%s\"%s%s", optarg,
|
||||||
|
errmsg ? ": " : "", errmsg ? errmsg : "");
|
||||||
|
g_free(errmsg);
|
||||||
exit_status = INVALID_OPTION;
|
exit_status = INVALID_OPTION;
|
||||||
goto clean_exit;
|
goto clean_exit;
|
||||||
break;
|
break;
|
||||||
|
@ -1227,6 +1232,7 @@ main(int argc, char *argv[])
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 'q': /* Quiet */
|
case 'q': /* Quiet */
|
||||||
quiet = TRUE;
|
quiet = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -471,11 +471,16 @@ void commandline_other_options(int argc, char *argv[], gboolean opt_reset)
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case 'o': /* Override preference from command line */
|
case 'o': /* Override preference from command line */
|
||||||
switch (prefs_set_pref(optarg)) {
|
{
|
||||||
|
char *errmsg = NULL;
|
||||||
|
|
||||||
|
switch (prefs_set_pref(optarg, &errmsg)) {
|
||||||
case PREFS_SET_OK:
|
case PREFS_SET_OK:
|
||||||
break;
|
break;
|
||||||
case PREFS_SET_SYNTAX_ERR:
|
case PREFS_SET_SYNTAX_ERR:
|
||||||
cmdarg_err("Invalid -o flag \"%s\"", optarg);
|
cmdarg_err("Invalid -o flag \"%s\"%s%s", optarg,
|
||||||
|
errmsg ? ": " : "", errmsg ? errmsg : "");
|
||||||
|
g_free(errmsg);
|
||||||
exit(1);
|
exit(1);
|
||||||
break;
|
break;
|
||||||
case PREFS_SET_NO_SUCH_PREF:
|
case PREFS_SET_NO_SUCH_PREF:
|
||||||
|
@ -507,6 +512,7 @@ void commandline_other_options(int argc, char *argv[], gboolean opt_reset)
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 'P':
|
case 'P':
|
||||||
/* Path settings were already processed just ignore them this time*/
|
/* Path settings were already processed just ignore them this time*/
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue