aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2015-04-13 18:22:49 +0200
committerMartin Willi <martin@revosec.ch>2015-04-15 14:38:43 +0200
commitde1c492a0f2605c68abac9b24fd70cd24ba8a143 (patch)
tree46fb108c3cc1a17c07995d7a1685c30ba8af0154
parente03fb1fb26755f6cbafed621d31f97aae7311294 (diff)
downloadstrongswan-de1c492a0f2605c68abac9b24fd70cd24ba8a143.tar.bz2
strongswan-de1c492a0f2605c68abac9b24fd70cd24ba8a143.tar.xz
enum-names: Fail gracefully when passing a NULL value as enum names
-rw-r--r--src/libstrongswan/tests/suites/test_enum.c10
-rw-r--r--src/libstrongswan/utils/enum.c6
2 files changed, 15 insertions, 1 deletions
diff --git a/src/libstrongswan/tests/suites/test_enum.c b/src/libstrongswan/tests/suites/test_enum.c
index 53ebd2931..70bfdb2aa 100644
--- a/src/libstrongswan/tests/suites/test_enum.c
+++ b/src/libstrongswan/tests/suites/test_enum.c
@@ -291,6 +291,15 @@ START_TEST(test_enum_printf_hook_split)
}
END_TEST
+START_TEST(test_enum_printf_hook_null)
+{
+ char buf[16];
+
+ snprintf(buf, sizeof(buf), "%N", NULL, 7);
+ ck_assert_str_eq("(7)", buf);
+}
+END_TEST
+
START_TEST(test_enum_printf_hook_flags)
{
char buf[1024];
@@ -406,6 +415,7 @@ Suite *enum_suite_create()
tc = tcase_create("enum_printf_hook");
tcase_add_loop_test(tc, test_enum_printf_hook_cont, 0, countof(printf_tests_cont));
tcase_add_loop_test(tc, test_enum_printf_hook_split, 0, countof(printf_tests_split));
+ tcase_add_test(tc, test_enum_printf_hook_null);
tcase_add_loop_test(tc, test_enum_printf_hook_flags, 0, countof(printf_tests_flags));
tcase_add_loop_test(tc, test_enum_printf_hook_flags_incomplete, 0, countof(printf_tests_flags_incomplete));
tcase_add_loop_test(tc, test_enum_printf_hook_flags_null, 0, countof(printf_tests_flags_null));
diff --git a/src/libstrongswan/utils/enum.c b/src/libstrongswan/utils/enum.c
index 089bebb79..1cead77ca 100644
--- a/src/libstrongswan/utils/enum.c
+++ b/src/libstrongswan/utils/enum.c
@@ -26,6 +26,10 @@
*/
char *enum_to_name(enum_name_t *e, int val)
{
+ if (!e)
+ {
+ return NULL;
+ }
do
{
if (val >= e->first && val <= e->last)
@@ -140,7 +144,7 @@ int enum_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
int val = *((int*)(args[1]));
char *name, buf[512];
- if (ed->next == ENUM_FLAG_MAGIC)
+ if (ed && ed->next == ENUM_FLAG_MAGIC)
{
name = enum_flags_to_string(ed, val, buf, sizeof(buf));
if (name == NULL)