summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJilles Tjoelker <jilles@irssi.org>2009-02-21 21:17:51 +0000
committerjilles <jilles@dbcabf3a-b0e7-0310-adc4-f8d773084564>2009-02-21 21:17:51 +0000
commitcb1f07352af92688983563998f9251ab20cac821 (patch)
tree9b01c36bec2240c4ba98f24bd5ed6a5a6ec60bd2
parent946e7784b00c9051013b996bd09dcaf144cf250c (diff)
downloadirssi-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.c2
-rw-r--r--src/core/levels.c8
-rw-r--r--src/core/levels.h2
-rw-r--r--src/core/log.c2
-rw-r--r--src/core/settings.c8
-rw-r--r--src/fe-common/core/fe-core-commands.c2
-rw-r--r--src/fe-common/core/fe-exec.c2
-rw-r--r--src/fe-common/core/fe-log.c2
-rw-r--r--src/fe-common/core/hilight-text.c2
-rw-r--r--src/fe-common/core/windows-layout.c2
-rw-r--r--src/fe-text/textbuffer-commands.c2
-rw-r--r--src/perl/common/Core.xs4
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)