Log to a malloc()ed buffer if the on-stack buffer is not large enough
This commit is contained in:
+23
-3
@@ -269,7 +269,7 @@ typedef struct {
|
|||||||
/** debug level */
|
/** debug level */
|
||||||
level_t level;
|
level_t level;
|
||||||
/** message */
|
/** message */
|
||||||
char message[8192];
|
char *message;
|
||||||
} log_data_t;
|
} log_data_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -294,13 +294,33 @@ METHOD(bus_t, vlog, void,
|
|||||||
{
|
{
|
||||||
linked_list_t *loggers = this->loggers[group];
|
linked_list_t *loggers = this->loggers[group];
|
||||||
log_data_t data;
|
log_data_t data;
|
||||||
|
va_list copy;
|
||||||
|
char buf[1024];
|
||||||
|
ssize_t len;
|
||||||
|
|
||||||
data.ike_sa = this->thread_sa->get(this->thread_sa);
|
data.ike_sa = this->thread_sa->get(this->thread_sa);
|
||||||
data.thread = thread_current_id();
|
data.thread = thread_current_id();
|
||||||
data.group = group;
|
data.group = group;
|
||||||
data.level = level;
|
data.level = level;
|
||||||
vsnprintf(data.message, sizeof(data.message), format, args);
|
data.message = buf;
|
||||||
loggers->invoke_function(loggers, (linked_list_invoke_t)log_cb, &data);
|
|
||||||
|
va_copy(copy, args);
|
||||||
|
len = vsnprintf(data.message, sizeof(buf), format, copy);
|
||||||
|
va_end(copy);
|
||||||
|
if (len >= sizeof(buf))
|
||||||
|
{
|
||||||
|
data.message = malloc(len);
|
||||||
|
len = vsnprintf(data.message, len, format, args);
|
||||||
|
}
|
||||||
|
if (len > 0)
|
||||||
|
{
|
||||||
|
loggers->invoke_function(loggers, (linked_list_invoke_t)log_cb,
|
||||||
|
&data);
|
||||||
|
}
|
||||||
|
if (data.message != buf)
|
||||||
|
{
|
||||||
|
free(data.message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this->log_lock->unlock(this->log_lock);
|
this->log_lock->unlock(this->log_lock);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user