vici: Fall back to heap buffer when vararg printing on stack fails

This avoids failures when building log event messages including larger hexdumps.
This commit is contained in:
Martin Willi
2015-03-18 13:59:14 +01:00
parent a47e431ba9
commit 288b654173
+44 -21
View File
@@ -84,6 +84,8 @@ METHOD(vici_builder_t, add, void,
if (value.len > 0xffff) if (value.len > 0xffff)
{ {
DBG1(DBG_ENC, "vici value exceeds size limit (%zu > %u)",
value.len, 0xffff);
this->error++; this->error++;
return; return;
} }
@@ -125,22 +127,56 @@ METHOD(vici_builder_t, add, void,
} }
} }
METHOD(vici_builder_t, vadd_kv, void, /**
private_vici_builder_t *this, char *key, char *fmt, va_list args) * Add a list item or a key/value, if key given
*/
static void vadd_kv_or_li(private_vici_builder_t *this, char *key,
char *fmt, va_list args)
{ {
char buf[2048]; u_char buf[512];
chunk_t value;
ssize_t len; ssize_t len;
va_list copy;
len = vsnprintf(buf, sizeof(buf), fmt, args); va_copy(copy, args);
if (len < 0 || len >= sizeof(buf)) len = vsnprintf(buf, sizeof(buf), fmt, copy);
va_end(copy);
if (len >= sizeof(buf))
{ {
DBG1(DBG_ENC, "vici builder format buffer exceeds limit"); value = chunk_alloc(len + 1);
len = vsnprintf(value.ptr, value.len, fmt, args);
}
else
{
value = chunk_create(buf, len);
}
if (len < 0)
{
DBG1(DBG_ENC, "vici builder format print failed");
this->error++; this->error++;
} }
else else
{ {
add(this, VICI_KEY_VALUE, key, chunk_create(buf, len)); if (key)
{
add(this, VICI_KEY_VALUE, key, value);
}
else
{
add(this, VICI_LIST_ITEM, value);
}
} }
if (value.ptr != buf)
{
free(value.ptr);
}
}
METHOD(vici_builder_t, vadd_kv, void,
private_vici_builder_t *this, char *key, char *fmt, va_list args)
{
vadd_kv_or_li(this, key, fmt, args);
} }
METHOD(vici_builder_t, add_kv, void, METHOD(vici_builder_t, add_kv, void,
@@ -153,23 +189,10 @@ METHOD(vici_builder_t, add_kv, void,
va_end(args); va_end(args);
} }
METHOD(vici_builder_t, vadd_li, void, METHOD(vici_builder_t, vadd_li, void,
private_vici_builder_t *this, char *fmt, va_list args) private_vici_builder_t *this, char *fmt, va_list args)
{ {
char buf[2048]; vadd_kv_or_li(this, NULL, fmt, args);
ssize_t len;
len = vsnprintf(buf, sizeof(buf), fmt, args);
if (len < 0 || len >= sizeof(buf))
{
DBG1(DBG_ENC, "vici builder format buffer exceeds limit");
this->error++;
}
else
{
add(this, VICI_LIST_ITEM, chunk_create(buf, len));
}
} }
METHOD(vici_builder_t, add_li, void, METHOD(vici_builder_t, add_li, void,