Was causing generation of corrupted filter bytecode.
Fixes #351,#344
Signed-off-by: Christian Babeux <christian.babeux@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
static
int bytecode_init(struct lttng_filter_bytecode_alloc **fb)
{
static
int bytecode_init(struct lttng_filter_bytecode_alloc **fb)
{
- *fb = calloc(sizeof(struct lttng_filter_bytecode_alloc) + INIT_ALLOC_SIZE, 1);
+ uint32_t alloc_len;
+
+ alloc_len = sizeof(struct lttng_filter_bytecode_alloc) + INIT_ALLOC_SIZE;
+ *fb = calloc(alloc_len, 1);
if (!*fb) {
return -ENOMEM;
} else {
if (!*fb) {
return -ENOMEM;
} else {
- (*fb)->alloc_len = INIT_ALLOC_SIZE;
+ (*fb)->alloc_len = alloc_len;
int32_t ret;
uint32_t padding = offset_align((*fb)->b.len, align);
uint32_t new_len = (*fb)->b.len + padding + len;
int32_t ret;
uint32_t padding = offset_align((*fb)->b.len, align);
uint32_t new_len = (*fb)->b.len + padding + len;
- uint32_t new_alloc_len = sizeof(struct lttng_filter_bytecode) + new_len;
+ uint32_t new_alloc_len = sizeof(struct lttng_filter_bytecode_alloc) + new_len;
uint32_t old_alloc_len = (*fb)->alloc_len;
if (new_len > LTTNG_FILTER_MAX_LEN)
uint32_t old_alloc_len = (*fb)->alloc_len;
if (new_len > LTTNG_FILTER_MAX_LEN)
*fb = realloc(*fb, new_alloc_len);
if (!*fb)
return -ENOMEM;
*fb = realloc(*fb, new_alloc_len);
if (!*fb)
return -ENOMEM;
+ /* We zero directly the memory from start of allocation. */
memset(&((char *) *fb)[old_alloc_len], 0, new_alloc_len - old_alloc_len);
(*fb)->alloc_len = new_alloc_len;
}
memset(&((char *) *fb)[old_alloc_len], 0, new_alloc_len - old_alloc_len);
(*fb)->alloc_len = new_alloc_len;
}