diff options
author | Jilles Tjoelker <jilles@irssi.org> | 2009-02-21 21:17:51 +0000 |
---|---|---|
committer | jilles <jilles@dbcabf3a-b0e7-0310-adc4-f8d773084564> | 2009-02-21 21:17:51 +0000 |
commit | cb1f07352af92688983563998f9251ab20cac821 (patch) | |
tree | 9b01c36bec2240c4ba98f24bd5ed6a5a6ec60bd2 | |
parent | 946e7784b00c9051013b996bd09dcaf144cf250c (diff) | |
download | irssi-cb1f07352af92688983563998f9251ab20cac821.zip |
Reject invalid level specifications in /set.
Most of these have names that end in "_level".
git-svn-id: file:///var/www/svn.irssi.org/SVN/irssi/trunk@5021 dbcabf3a-b0e7-0310-adc4-f8d773084564
-rw-r--r-- | src/core/ignore.c | 2 | ||||
-rw-r--r-- | src/core/levels.c | 8 | ||||
-rw-r--r-- | src/core/levels.h | 2 | ||||
-rw-r--r-- | src/core/log.c | 2 | ||||
-rw-r--r-- | src/core/settings.c | 8 | ||||
-rw-r--r-- | src/fe-common/core/fe-core-commands.c | 2 | ||||
-rw-r--r-- | src/fe-common/core/fe-exec.c | 2 | ||||
-rw-r--r-- | src/fe-common/core/fe-log.c | 2 | ||||
-rw-r--r-- | src/fe-common/core/hilight-text.c | 2 | ||||
-rw-r--r-- | src/fe-common/core/windows-layout.c | 2 | ||||
-rw-r--r-- | src/fe-text/textbuffer-commands.c | 2 | ||||
-rw-r--r-- | src/perl/common/Core.xs | 4 |
12 files changed, 26 insertions, 12 deletions
diff --git a/src/core/ignore.c b/src/core/ignore.c index f69a900e..ef7221b7 100644 --- a/src/core/ignore.c +++ b/src/core/ignore.c @@ -395,7 +395,7 @@ static void read_ignores(void) rec->mask = g_strdup(config_node_get_str(node, "mask", NULL)); rec->pattern = g_strdup(config_node_get_str(node, "pattern", NULL)); - rec->level = level2bits(config_node_get_str(node, "level", "")); + rec->level = level2bits(config_node_get_str(node, "level", ""), NULL); rec->exception = config_node_get_bool(node, "exception", FALSE); rec->regexp = config_node_get_bool(node, "regexp", FALSE); rec->fullword = config_node_get_bool(node, "fullword", FALSE); diff --git a/src/core/levels.c b/src/core/levels.c index 73743352..3cc00e95 100644 --- a/src/core/levels.c +++ b/src/core/levels.c @@ -81,11 +81,14 @@ int level_get(const char *level) return match; } -int level2bits(const char *level) +int level2bits(const char *level, int *errorp) { char *orig, *str, *ptr; int ret, singlelevel, negative; + if (errorp != NULL) + *errorp = FALSE; + g_return_val_if_fail(level != NULL, 0); if (*level == '\0') @@ -107,7 +110,8 @@ int level2bits(const char *level) if (singlelevel != 0) { ret = !negative ? (ret | singlelevel) : (ret & ~singlelevel); - } + } else if (errorp != NULL) + *errorp = TRUE; while (*str == ' ') str++; if (*str == '\0') break; diff --git a/src/core/levels.h b/src/core/levels.h index dec7afe7..9f7e588f 100644 --- a/src/core/levels.h +++ b/src/core/levels.h @@ -40,7 +40,7 @@ enum { }; int level_get(const char *level); -int level2bits(const char *level); +int level2bits(const char *level, int *errorp); char *bits2level(int bits); int combine_level(int dest, const char *src); diff --git a/src/core/log.c b/src/core/log.c index 67ff24c1..106aafb8 100644 --- a/src/core/log.c +++ b/src/core/log.c @@ -540,7 +540,7 @@ static void log_read_config(void) log->handle = -1; log->fname = g_strdup(node->key); log->autoopen = config_node_get_bool(node, "auto_open", FALSE); - log->level = level2bits(config_node_get_str(node, "level", 0)); + log->level = level2bits(config_node_get_str(node, "level", 0), NULL); signal_emit("log config read", 2, log, node); diff --git a/src/core/settings.c b/src/core/settings.c index cb196bd1..bfcead3e 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -134,7 +134,7 @@ int settings_get_level(const char *key) const char *str; str = settings_get_str_type(key, SETTING_TYPE_LEVEL); - return str == NULL ? 0 : level2bits(str); + return str == NULL ? 0 : level2bits(str, NULL); } int settings_get_size(const char *key) @@ -355,6 +355,12 @@ int settings_set_time(const char *key, const char *value) int settings_set_level(const char *key, const char *value) { + int iserror; + + (void)level2bits(value, &iserror); + if (iserror) + return FALSE; + iconfig_node_set_str(settings_get_node(key), key, value); return TRUE; } diff --git a/src/fe-common/core/fe-core-commands.c b/src/fe-common/core/fe-core-commands.c index 86f62489..d991b1a7 100644 --- a/src/fe-common/core/fe-core-commands.c +++ b/src/fe-common/core/fe-core-commands.c @@ -81,7 +81,7 @@ static void cmd_echo(const char *data, void *server, WI_ITEM_REC *item) levelstr = g_hash_table_lookup(optlist, "level"); level = levelstr == NULL ? 0 : - level2bits(g_hash_table_lookup(optlist, "level")); + level2bits(g_hash_table_lookup(optlist, "level"), NULL); if (level == 0) level = MSGLEVEL_CRAP; winname = g_hash_table_lookup(optlist, "window"); diff --git a/src/fe-common/core/fe-exec.c b/src/fe-common/core/fe-exec.c index 53656007..e8bde1ca 100644 --- a/src/fe-common/core/fe-exec.c +++ b/src/fe-common/core/fe-exec.c @@ -513,7 +513,7 @@ static void handle_exec(const char *args, GHashTable *optlist, rec->name = g_strdup(g_hash_table_lookup(optlist, "name")); level = g_hash_table_lookup(optlist, "level"); - rec->level = level == NULL ? MSGLEVEL_CLIENTCRAP : level2bits(level); + rec->level = level == NULL ? MSGLEVEL_CLIENTCRAP : level2bits(level, NULL); rec->read_tag = g_input_add(rec->in, G_INPUT_READ, (GInputFunction) sig_exec_input_reader, diff --git a/src/fe-common/core/fe-log.c b/src/fe-common/core/fe-log.c index e3496a63..32086435 100644 --- a/src/fe-common/core/fe-log.c +++ b/src/fe-common/core/fe-log.c @@ -92,7 +92,7 @@ static void cmd_log_open(const char *data) return; if (*fname == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); - level = level2bits(levels); + level = level2bits(levels, NULL); log = log_create_rec(fname, level != 0 ? level : MSGLEVEL_ALL); /* -<server tag> */ diff --git a/src/fe-common/core/hilight-text.c b/src/fe-common/core/hilight-text.c index a043d60f..f501db93 100644 --- a/src/fe-common/core/hilight-text.c +++ b/src/fe-common/core/hilight-text.c @@ -576,7 +576,7 @@ static void cmd_hilight(const char *data) } rec->level = (levelarg == NULL || *levelarg == '\0') ? 0 : - level2bits(replace_chars(levelarg, ',', ' ')); + level2bits(replace_chars(levelarg, ',', ' '), NULL); rec->priority = priorityarg == NULL ? 0 : atoi(priorityarg); if (g_hash_table_lookup(optlist, "line") != NULL) { diff --git a/src/fe-common/core/windows-layout.c b/src/fe-common/core/windows-layout.c index 4db60431..d6a462cf 100644 --- a/src/fe-common/core/windows-layout.c +++ b/src/fe-common/core/windows-layout.c @@ -134,7 +134,7 @@ static void sig_layout_restore(void) window->immortal = config_node_get_bool(node, "immortal", FALSE); window_set_name(window, config_node_get_str(node, "name", NULL)); window_set_history(window, config_node_get_str(node, "history_name", NULL)); - window_set_level(window, level2bits(config_node_get_str(node, "level", ""))); + window_set_level(window, level2bits(config_node_get_str(node, "level", ""), NULL)); window->servertag = g_strdup(config_node_get_str(node, "servertag", NULL)); window->theme_name = g_strdup(config_node_get_str(node, "theme", NULL)); diff --git a/src/fe-text/textbuffer-commands.c b/src/fe-text/textbuffer-commands.c index a99b4af4..648862e7 100644 --- a/src/fe-text/textbuffer-commands.c +++ b/src/fe-text/textbuffer-commands.c @@ -146,7 +146,7 @@ static void cmd_scrollback_levelclear(const char *data) levelarg = g_hash_table_lookup(optlist, "level"); level = (levelarg == NULL || *levelarg == '\0') ? 0 : - level2bits(replace_chars(levelarg, ',', ' ')); + level2bits(replace_chars(levelarg, ',', ' '), NULL); if (level == 0) { cmd_params_free(free_arg); return; diff --git a/src/perl/common/Core.xs b/src/perl/common/Core.xs index 1a7ee18d..76ea0093 100644 --- a/src/perl/common/Core.xs +++ b/src/perl/common/Core.xs @@ -492,6 +492,10 @@ OUTPUT: int level2bits(str) char *str +CODE: + RETVAL = level2bits(str, NULL); +OUTPUT: + RETVAL void bits2level(bits) |