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:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user