<32bit: event filter strings count>
Repeat for "event filter strings count":
<NUL-terminated string: event filter string>
- <NUL-terminated string: override event filter string>
<32bit: number of named list filter elements>
Repeat until "settings full size" is reached:
static void
config_dump_full_append_filter_query(string_t *str,
- const struct config_filter *filter,
- bool write_named_filters)
+ const struct config_filter *filter)
{
if (filter->protocol != NULL) {
if (filter->protocol[0] != '!') {
} else if (filter->filter_name != NULL) {
const char *filter_name = filter->filter_name;
- if (write_named_filters) {
- str_printfa(str, SETTINGS_EVENT_FILTER_NAME"=\"%s\" AND ",
- wildcard_str_escape(filter_name));
- }
+ str_printfa(str, SETTINGS_EVENT_FILTER_NAME"=\"%s\" AND ",
+ wildcard_str_escape(filter_name));
}
}
static void
config_dump_full_append_filter(string_t *str,
- const struct config_filter *filter,
- bool write_named_filters)
+ const struct config_filter *filter)
{
do {
- config_dump_full_append_filter_query(str, filter,
- write_named_filters);
+ config_dump_full_append_filter_query(str, filter);
filter = filter->parent;
} while (filter != NULL);
/* the first filter is the global empty filter */
uint32_t named_list_filter_count = 0;
o_stream_nsend(output, "", 1);
- o_stream_nsend(output, "", 1);
o_stream_nsend(output, &named_list_filter_count,
sizeof(named_list_filter_count));
string_t *str = str_new(default_pool, 128);
for (i = 1; i < filter_count; i++) T_BEGIN {
str_truncate(str, 0);
- config_dump_full_append_filter(str, &filters[i]->filter, TRUE);
- str_append_c(str, '\0');
- o_stream_nsend(output, str_data(str), str_len(str));
-
- str_truncate(str, 0);
- config_dump_full_append_filter(str, &filters[i]->filter, FALSE);
+ config_dump_full_append_filter(str, &filters[i]->filter);
str_append_c(str, '\0');
o_stream_nsend(output, str_data(str), str_len(str));
string_t *str = t_str_new(128);
if (ctx->filter != NULL)
- config_dump_full_append_filter(str, ctx->filter, TRUE);
+ config_dump_full_append_filter(str, ctx->filter);
str_insert(str, 0, ":FILTER ");
str_append_c(str, '\n');
/* full file size is 7 bytes, which makes the first block size
truncated, since it needs 8 bytes */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x26") // full size
+ NUM64("\x25") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
"\x00\x00\x00\x00\x00\x00\x00"), // block size
"Area too small when reading size of 'block size'" },
/* first block size is 0, which is too small */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x27") // full size
+ NUM64("\x26") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x00")), // block size
"'block name' points outside area" },
/* first block size is 1, but full file size is too small */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x27") // full size
+ NUM64("\x26") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x01")), // block size
"'block size' points outside are" },
/* block name is not NUL-terminated */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x29") // full size
+ NUM64("\x28") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x01") // block size
"N"
/* settings count is truncated */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x2C") // full size
+ NUM64("\x2B") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x05") // block size
"N\x00" // block name
/* settings keys are truncated */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x2D") // full size
+ NUM64("\x2C") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x06") // block size
"N\x00" // block name
/* filter count is truncated */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x32") // full size
+ NUM64("\x31") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x0B") // block size
"N\x00" // block name
/* filter settings size is truncated */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x3A") // full size
+ NUM64("\x39") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x12") // block size
"N\x00" // block name
/* filter settings is truncated */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x3B") // full size
+ NUM64("\x3A") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x14") // block size
"N\x00" // block name
"'filter settings size' points outside area" },
/* filter error is missing */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x48") // full size
+ NUM64("\x47") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x21") // block size
"N\x00" // block name
"'filter error string' points outside area" },
/* filter error is not NUL-terminated */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x56") // full size
+ NUM64("\x55") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x2F") // block size
"master_service\x00" // block name
"'filter error string' points outside area" },
/* include group count is truncated */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x59") // full size
+ NUM64("\x58") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x32") // block size
"master_service\x00" // block name
"Area too small when reading uint of 'include group count'" },
/* include group count is too large */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x5A") // full size
+ NUM64("\x59") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x33") // block size
"master_service\x00" // block name
"'group label string' points outside area" },
/* group label not NUL-terminated */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x5B") // full size
+ NUM64("\x5A") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x34") // block size
"master_service\x00" // block name
"'group label string' points outside area" },
/* group name not NUL-terminated */
{ DATA("DOVECOT-CONFIG\t1.0\n"
- NUM64("\x5D") // full size
+ NUM64("\x5C") // full size
NUM32("\x00") // cache path count
NUM32("\x0D") // all keys size
"\x00" // 32bit padding
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
NUM64("\x36") // block size
"master_service\x00" // block name
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"F\x00" // event filter[0]
- "F\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
- NUM64("\x26") // block size
+ NUM64("\x28") // block size
"N\x00" // block name
NUM32("\x01") // settings count
"K\x00" // setting[0] key
NUM64("\x05") // filter settings size
"\x00" // filter error string
NUM32("\x00") // include group count
- // 64bit padding
+ "\x00\x00" // 64bit padding
NUM64("\x00") // filter[0] settings offset
NUM32("\x00") // filter[0] event filter index
"\x00"), // safety NUL
NUM32("\x00") // block names count
NUM32("\x01") // event filter count
"\x00" // event filter[0]
- "\x00" // override event filter[0]
NUM32("\x00") // number of named list filter elements
- NUM64("\x2B") // block size
+ NUM64("\x2C") // block size
"N\x00" // block name
NUM32("\x01") // settings count
"K\x00" // setting[0] key
NUM64("\x05") // filter settings size
"\x00" // filter error string
NUM32("\x00") // include group count
- "\x00\x00\x00\x00\x00" // 64bit padding
+ "\x00\x00\x00\x00\x00\x00" // 64bit padding
NUM64("\x00") // filter[0] settings offset
NUM32("\x00") // filter[0] event filter index
"\x00" // safety NUL
struct settings_mmap_event_filter {
struct event_filter *filter;
- struct event_filter *override_filter;
bool is_group;
uint32_t named_list_filter_count;
p_new(mmap->pool, struct settings_mmap_event_filter,
mmap->event_filters_count);
- for (uint32_t i = 0; i < 2 * mmap->event_filters_count; i++) {
+ for (uint32_t i = 0; i < mmap->event_filters_count; i++) {
struct settings_mmap_event_filter *set_filter =
- &mmap->event_filters[i / 2];
- struct event_filter **filter_dest =
- i % 2 == 0 ? &set_filter->filter :
- &set_filter->override_filter;
+ &mmap->event_filters[i];
if (settings_block_read_str(mmap, offset, mmap->mmap_size,
"filter string", &filter_string,
error_r) < 0)
return -1;
- if (i % 2 != 0) {
- if (settings_block_read_uint32(mmap, offset, mmap->mmap_size,
+ if (settings_block_read_uint32(mmap, offset, mmap->mmap_size,
"named list filter element count",
&set_filter->named_list_filter_count,
error_r) < 0)
- return -1;
- }
+ return -1;
if (filter_string[0] == '\0') {
- *filter_dest = EVENT_FILTER_MATCH_ALWAYS;
+ set_filter->filter = EVENT_FILTER_MATCH_ALWAYS;
continue;
}
(strcmp(mmap->root->protocol_name, value) == 0) == op_not &&
(flags & SETTINGS_READ_NO_PROTOCOL_FILTER) == 0) {
/* protocol doesn't match */
- *filter_dest = EVENT_FILTER_MATCH_NEVER;
+ set_filter->filter = EVENT_FILTER_MATCH_NEVER;
event_filter_unref(&tmp_filter);
continue;
}
if (service_name != NULL &&
!settings_filter_match_service(tmp_filter, service_name)) {
/* service name doesn't match */
- *filter_dest = EVENT_FILTER_MATCH_NEVER;
+ set_filter->filter = EVENT_FILTER_MATCH_NEVER;
event_filter_unref(&tmp_filter);
continue;
}
SETTINGS_EVENT_FILTER_NAME,
SETTINGS_INCLUDE_GROUP_PREFIX_S);
- *filter_dest = event_filter_create_with_pool(mmap->pool);
- event_filter_register_cmp(*filter_dest, "local_name",
+ set_filter->filter = event_filter_create_with_pool(mmap->pool);
+ event_filter_register_cmp(set_filter->filter, "local_name",
settings_local_name_cmp);
pool_ref(mmap->pool);
- event_filter_merge(*filter_dest, tmp_filter,
+ event_filter_merge(set_filter->filter, tmp_filter,
EVENT_FILTER_MERGE_OP_OR);
event_filter_unref(&tmp_filter);
}
if (mmap->event_filters[i].filter != EVENT_FILTER_MATCH_ALWAYS &&
mmap->event_filters[i].filter != EVENT_FILTER_MATCH_NEVER)
event_filter_unref(&mmap->event_filters[i].filter);
- if (mmap->event_filters[i].override_filter != EVENT_FILTER_MATCH_ALWAYS &&
- mmap->event_filters[i].override_filter != EVENT_FILTER_MATCH_NEVER)
- event_filter_unref(&mmap->event_filters[i].override_filter);
}
hash_table_destroy(&mmap->blocks);