aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael G. Martins <rafael@rafaelmartins.eng.br>2019-09-09 20:44:18 +0200
committerRafael G. Martins <rafael@rafaelmartins.eng.br>2019-09-09 20:44:25 +0200
commita576156e5bf9de147efe2c76af1ee29f5efd773e (patch)
treea72f60f78cd4db77ce5d10d084b6d1c8e1e0fe27
parentc9df78f02b66513c6e831d81c3240a715fee7e70 (diff)
downloadblogc-a576156e5bf9de147efe2c76af1ee29f5efd773e.tar.gz
blogc-a576156e5bf9de147efe2c76af1ee29f5efd773e.tar.bz2
blogc-a576156e5bf9de147efe2c76af1ee29f5efd773e.zip
common: prevent stdarg errors when format is NULL
-rw-r--r--src/common/error.c4
-rw-r--r--src/common/utils.c6
-rw-r--r--tests/common/check_error.c7
-rw-r--r--tests/common/check_utils.c4
4 files changed, 20 insertions, 1 deletions
diff --git a/src/common/error.c b/src/common/error.c
index 03695e7..caf47c3 100644
--- a/src/common/error.c
+++ b/src/common/error.c
@@ -26,6 +26,8 @@ bc_error_new(bc_error_type_t type, const char *msg)
bc_error_t*
bc_error_new_printf(bc_error_type_t type, const char *format, ...)
{
+ if (format == NULL)
+ return bc_error_new(type, "");
va_list ap;
va_start(ap, format);
char *tmp = bc_strdup_vprintf(format, ap);
@@ -40,6 +42,8 @@ bc_error_t*
bc_error_parser(bc_error_type_t type, const char *src, size_t src_len,
size_t current, const char *format, ...)
{
+ if (format == NULL)
+ return bc_error_new(type, "");
va_list ap;
va_start(ap, format);
char *msg = bc_strdup_vprintf(format, ap);
diff --git a/src/common/utils.c b/src/common/utils.c
index 692d1ce..f686222 100644
--- a/src/common/utils.c
+++ b/src/common/utils.c
@@ -138,6 +138,8 @@ bc_strndup(const char *s, size_t n)
char*
bc_strdup_vprintf(const char *format, va_list ap)
{
+ if (format == NULL)
+ return NULL;
va_list ap2;
va_copy(ap2, ap);
int l = vsnprintf(NULL, 0, format, ap2);
@@ -159,6 +161,8 @@ bc_strdup_vprintf(const char *format, va_list ap)
char*
bc_strdup_printf(const char *format, ...)
{
+ if (format == NULL)
+ return NULL;
va_list ap;
va_start(ap, format);
char *tmp = bc_strdup_vprintf(format, ap);
@@ -464,6 +468,8 @@ bc_string_append_printf(bc_string_t *str, const char *format, ...)
{
if (str == NULL)
return NULL;
+ if (format == NULL)
+ return str;
va_list ap;
va_start(ap, format);
char *tmp = bc_strdup_vprintf(format, ap);
diff --git a/tests/common/check_error.c b/tests/common/check_error.c
index d9806f9..1b6f855 100644
--- a/tests/common/check_error.c
+++ b/tests/common/check_error.c
@@ -28,7 +28,12 @@ test_error_new(void **state)
static void
test_error_new_printf(void **state)
{
- bc_error_t *error = bc_error_new_printf(2, "bola %s", "guda");
+ bc_error_t *error = bc_error_new_printf(2, NULL);
+ assert_non_null(error);
+ assert_int_equal(error->type, 2);
+ assert_string_equal(error->msg, "");
+ bc_error_free(error);
+ error = bc_error_new_printf(2, "bola %s", "guda");
assert_non_null(error);
assert_int_equal(error->type, 2);
assert_string_equal(error->msg, "bola guda");
diff --git a/tests/common/check_utils.c b/tests/common/check_utils.c
index cc14f4e..471cd77 100644
--- a/tests/common/check_utils.c
+++ b/tests/common/check_utils.c
@@ -117,6 +117,7 @@ test_strndup(void **state)
static void
test_strdup_printf(void **state)
{
+ assert_null(bc_strdup_printf(NULL));
char *str = bc_strdup_printf("bola");
assert_string_equal(str, "bola");
free(str);
@@ -554,6 +555,9 @@ static void
test_string_append_printf(void **state)
{
bc_string_t *str = bc_string_new();
+ str = bc_string_append_printf(str, NULL);
+ assert_string_equal(str->str, "");
+ assert_non_null(str);
str = bc_string_append_printf(str, "guda: %s %d", "bola", 1);
assert_non_null(str);
assert_string_equal(str->str, "guda: bola 1");