aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2018-09-11 23:49:13 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2018-09-13 15:46:55 +0000
commit098038ab181a24d6050413a409b1bcb327d21ea6 (patch)
treebdf19b32bf965f76146a0bddfcf5613a9f8a94f4
parent7e0686c6b4b456ec4e6e15689694b1bcf96c301f (diff)
logging vty: write: check logging levels validity
-rw-r--r--include/osmocom/core/logging_internal.h1
-rw-r--r--src/logging.c2
-rw-r--r--src/vty/logging_vty.c30
3 files changed, 25 insertions, 8 deletions
diff --git a/include/osmocom/core/logging_internal.h b/include/osmocom/core/logging_internal.h
index 55b1bbd8..a510f83e 100644
--- a/include/osmocom/core/logging_internal.h
+++ b/include/osmocom/core/logging_internal.h
@@ -8,6 +8,7 @@
extern void *tall_log_ctx;
extern const struct log_info *osmo_log_info;
+extern const struct value_string loglevel_strs[];
void assert_loginfo(const char *src);
diff --git a/src/logging.c b/src/logging.c
index 67470a5d..e7cc4729 100644
--- a/src/logging.c
+++ b/src/logging.c
@@ -63,7 +63,7 @@ static struct log_context log_context;
void *tall_log_ctx = NULL;
LLIST_HEAD(osmo_log_target_list);
-static const struct value_string loglevel_strs[] = {
+const struct value_string loglevel_strs[] = {
{ LOGL_DEBUG, "DEBUG" },
{ LOGL_INFO, "INFO" },
{ LOGL_NOTICE, "NOTICE" },
diff --git a/src/vty/logging_vty.c b/src/vty/logging_vty.c
index 6758dd22..c8e85209 100644
--- a/src/vty/logging_vty.c
+++ b/src/vty/logging_vty.c
@@ -861,21 +861,37 @@ static int config_write_log_single(struct vty *vty, struct log_target *tgt)
get_value_string(logging_print_file_args, tgt->print_filename2),
VTY_NEWLINE);
- /* stupid old osmo logging API uses uppercase strings... */
- if (tgt->loglevel)
- vty_out(vty, " logging level all %s%s", osmo_str_tolower(log_level_str(tgt->loglevel)),
- VTY_NEWLINE);
+ if (tgt->loglevel) {
+ const char *level_str = get_value_string_or_null(loglevel_strs, tgt->loglevel);
+ level_str = osmo_str_tolower(level_str);
+ if (!level_str)
+ vty_out(vty, "%% Invalid log level %u for 'all'%s", tgt->loglevel, VTY_NEWLINE);
+ else
+ vty_out(vty, " logging level all %s%s", level_str, VTY_NEWLINE);
+ }
for (i = 0; i < osmo_log_info->num_cat; i++) {
const struct log_category *cat = &tgt->categories[i];
+ const char *cat_name;
+ const char *level_str;
/* skip empty entries in the array */
if (!osmo_log_info->cat[i].name)
continue;
- /* stupid old osmo logging API uses uppercase strings... */
- vty_out(vty, " logging level %s", osmo_str_tolower(osmo_log_info->cat[i].name+1));
- vty_out(vty, " %s%s", osmo_str_tolower(log_level_str(cat->loglevel)), VTY_NEWLINE);
+ /* Note: cat_name references the static buffer returned by osmo_str_tolower(), will
+ * become invalid after next osmo_str_tolower() invocation. */
+ cat_name = osmo_str_tolower(osmo_log_info->cat[i].name+1);
+
+ level_str = get_value_string_or_null(loglevel_strs, cat->loglevel);
+ if (!level_str) {
+ vty_out(vty, "%% Invalid log level %u for %s%s", cat->loglevel, cat_name,
+ VTY_NEWLINE);
+ continue;
+ }
+
+ vty_out(vty, " logging level %s", cat_name);
+ vty_out(vty, " %s%s", osmo_str_tolower(level_str), VTY_NEWLINE);
}
return 1;