#include "first.h" #include "array.h" #include "configfile.h" #include #include #ifdef HAVE_PCRE_H #include #ifndef PCRE_STUDY_JIT_COMPILE #define PCRE_STUDY_JIT_COMPILE 0 #define pcre_free_study(x) pcre_free(x) #endif #endif __attribute_cold__ static data_unset *data_config_copy(const data_unset *s) { data_config *src = (data_config *)s; data_config *ds = data_config_init(); ds->comp = src->comp; if (!buffer_is_empty(&src->key)) { buffer_copy_buffer(&ds->key, &src->key); ds->comp_key = ds->key.ptr + (src->comp_key - src->key.ptr); } buffer_copy_buffer(&ds->comp_tag, &src->comp_tag); array_copy_array(ds->value, src->value); return (data_unset *)ds; } __attribute_cold__ static void data_config_free(data_unset *d) { data_config *ds = (data_config *)d; free(ds->key.ptr); free(ds->comp_tag.ptr); array_free(ds->value); vector_config_weak_clear(&ds->children); free(ds->string.ptr); #ifdef HAVE_PCRE_H if (ds->regex) pcre_free(ds->regex); if (ds->regex_study) pcre_free_study(ds->regex_study); #endif free(d); } __attribute_cold__ static int data_config_insert_dup(data_unset *dst, data_unset *src) { UNUSED(dst); src->fn->free(src); return 0; } data_config *data_config_init(void) { static const struct data_methods fn = { data_config_copy, data_config_free, data_config_insert_dup, }; data_config *ds; ds = calloc(1, sizeof(*ds)); force_assert(ds); ds->comp_key = ""; ds->value = array_init(4); vector_config_weak_init(&ds->children); ds->type = TYPE_CONFIG; ds->fn = &fn; return ds; } #include "log.h" int data_config_pcre_compile(data_config * const dc, const int pcre_jit, log_error_st * const errh) { #ifdef HAVE_PCRE_H const char *errptr; int erroff, captures; dc->regex = pcre_compile(dc->string.ptr, 0, &errptr, &erroff, NULL); if (NULL == dc->regex) { log_error(errh, __FILE__, __LINE__, "parsing regex failed: %s -> %s at offset %d\n", dc->string.ptr, errptr, erroff); return 0; } const int study_options = pcre_jit ? PCRE_STUDY_JIT_COMPILE : 0; dc->regex_study = pcre_study(dc->regex, study_options, &errptr); if (NULL == dc->regex_study && errptr != NULL) { log_error(errh, __FILE__, __LINE__, "studying regex failed: %s -> %s\n", dc->string.ptr, errptr); return 0; } erroff = pcre_fullinfo(dc->regex, dc->regex_study, PCRE_INFO_CAPTURECOUNT, &captures); if (0 != erroff) { log_error(errh, __FILE__, __LINE__, "getting capture count for regex failed: %s\n", dc->string.ptr); return 0; } else if (captures > 9) { log_error(errh, __FILE__, __LINE__, "Too many captures in regex, use (?:...) instead of (...): %s\n", dc->string.ptr); return 0; } return 1; #else UNUSED(pcre_jit); log_error(errh, __FILE__, __LINE__, "can't handle '%s' as you compiled without pcre support. \n" "(perhaps just a missing pcre-devel package ?) \n", dc->comp_key); return 0; #endif }