Allow logging in module init cb (#344)

fix memory corruption in config reload, also fix logging & route disabling

Co-authored-by: reshke <Kirill Reshke>
This commit is contained in:
kirill reshke 2021-08-10 12:50:00 +05:00 committed by GitHub
parent d2bf7f2977
commit 5d129fa783
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 134 additions and 12 deletions

View File

@ -52,7 +52,7 @@ od_retcode_t od_logger_init(od_logger_t *logger, od_pid_t *pid)
static inline void od_logger(void *arg); static inline void od_logger(void *arg);
#define OD_LOGGER_TASK_CHANNEL_LIMIT 1 << 5 #define OD_LOGGER_TASK_CHANNEL_LIMIT 1 << 8
od_retcode_t od_logger_load(od_logger_t *logger) od_retcode_t od_logger_load(od_logger_t *logger)
{ {

View File

@ -46,6 +46,9 @@ int od_target_module_add(od_logger_t *logger, od_module_t *modules,
handle = od_dlopen(target_module_path); handle = od_dlopen(target_module_path);
if (!handle) { if (!handle) {
od_log(logger, "load_module", NULL, NULL,
"errors while openning %s module: %s",
target_module_path, dlerror());
goto error; goto error;
} }
module_ptr = od_load_module(handle); module_ptr = od_load_module(handle);
@ -63,7 +66,7 @@ int od_target_module_add(od_logger_t *logger, od_module_t *modules,
strcat(module_ptr->path, target_module_path); strcat(module_ptr->path, target_module_path);
if (module_ptr->module_init_cb) { if (module_ptr->module_init_cb) {
return module_ptr->module_init_cb(); return module_ptr->module_init_cb(logger);
} }
return OD_MODULE_CB_OK_RETCODE; return OD_MODULE_CB_OK_RETCODE;

View File

@ -14,7 +14,7 @@
#define OD_MODULE_CB_FAIL_RETCODE -1 #define OD_MODULE_CB_FAIL_RETCODE -1
/* init */ /* init */
typedef int (*module_init_cb_t)(); typedef int (*module_init_cb_t)(od_logger_t *logger);
/* auth */ /* auth */
typedef int (*client_auth_attempt_cb_t)(od_client_t *c); typedef int (*client_auth_attempt_cb_t)(od_client_t *c);

View File

@ -83,6 +83,7 @@ static inline int od_router_reload_cb(od_route_t *route, void **argv)
int od_router_reconfigure(od_router_t *router, od_rules_t *rules) int od_router_reconfigure(od_router_t *router, od_rules_t *rules)
{ {
od_instance_t *instance = router->global->instance;
od_router_lock(router); od_router_lock(router);
int updates; int updates;
@ -95,9 +96,27 @@ int od_router_reconfigure(od_router_t *router, od_rules_t *rules)
if (updates > 0) { if (updates > 0) {
od_extention_t *extentions = router->global->extentions; od_extention_t *extentions = router->global->extentions;
od_module_t *modules = extentions->modules;
/* reloadcallback */
od_list_t *i; od_list_t *i;
od_module_t *modules = extentions->modules;
od_list_foreach(&added, i)
{
od_rule_key_t *rk;
rk = od_container_of(i, od_rule_key_t, link);
od_log(&instance->logger, "reload config", NULL, NULL,
"added rule: %s %s", rk->usr_name, rk->db_name);
}
od_list_foreach(&deleted, i)
{
od_rule_key_t *rk;
rk = od_container_of(i, od_rule_key_t, link);
od_log(&instance->logger, "reload config", NULL, NULL,
"deleted rule: %s %s", rk->usr_name,
rk->db_name);
}
/* reloadcallback */
od_list_foreach(&modules->link, i) od_list_foreach(&modules->link, i)
{ {
od_module_t *module; od_module_t *module;
@ -111,11 +130,18 @@ int od_router_reconfigure(od_router_t *router, od_rules_t *rules)
} }
} }
od_list_foreach(&added, i)
{
od_rule_key_t *rk;
rk = od_container_of(i, od_rule_key_t, link);
od_rule_key_free(rk);
}
od_list_foreach(&deleted, i) od_list_foreach(&deleted, i)
{ {
od_rule_t *rule; od_rule_key_t *rk;
rule = od_container_of(i, od_rule_t, link); rk = od_container_of(i, od_rule_key_t, link);
od_rules_rule_free(rule); od_rule_key_free(rk);
} }
od_route_pool_foreach(&router->route_pool, od_router_reload_cb, od_route_pool_foreach(&router->route_pool, od_router_reload_cb,

View File

@ -596,8 +596,80 @@ __attribute__((hot)) int od_rules_merge(od_rules_t *rules, od_rules_t *src,
count_mark++; count_mark++;
} }
/* select new rules */ /* select dropped rules */
od_list_t *n; od_list_t *n;
od_list_foreach_safe(&rules->rules, i, n)
{
od_rule_t *rule_old;
rule_old = od_container_of(i, od_rule_t, link);
int ok = 0;
od_list_t *m;
od_list_t *j;
od_list_foreach_safe(&src->rules, j, m)
{
od_rule_t *rule_new;
rule_new = od_container_of(j, od_rule_t, link);
if (strcmp(rule_old->user_name, rule_new->user_name) ==
0 &&
strcmp(rule_old->db_name, rule_new->db_name) == 0) {
ok = 1;
break;
}
}
if (!ok) {
od_rule_key_t *rk = malloc(sizeof(od_rule_key_t));
od_rule_key_init(rk);
rk->usr_name = strndup(rule_old->user_name,
rule_old->user_name_len);
rk->db_name = strndup(rule_old->db_name,
rule_old->db_name_len);
od_list_append(deleted, &rk->link);
}
};
/* select added rules */
od_list_foreach_safe(&src->rules, i, n)
{
od_rule_t *rule_new;
rule_new = od_container_of(i, od_rule_t, link);
int ok = 0;
od_list_t *m;
od_list_t *j;
od_list_foreach_safe(&rules->rules, j, m)
{
od_rule_t *rule_old;
rule_old = od_container_of(j, od_rule_t, link);
if (strcmp(rule_old->user_name, rule_new->user_name) ==
0 &&
strcmp(rule_old->db_name, rule_new->db_name) == 0) {
ok = 1;
break;
}
}
if (!ok) {
od_rule_key_t *rk = malloc(sizeof(od_rule_key_t));
od_rule_key_init(rk);
rk->usr_name = strndup(rule_new->user_name,
rule_new->user_name_len);
rk->db_name = strndup(rule_new->db_name,
rule_new->db_name_len);
od_list_append(added, &rk->link);
}
};
/* select new rules */
od_list_foreach_safe(&src->rules, i, n) od_list_foreach_safe(&src->rules, i, n)
{ {
od_rule_t *rule; od_rule_t *rule;
@ -643,9 +715,7 @@ __attribute__((hot)) int od_rules_merge(od_rules_t *rules, od_rules_t *src,
rule->obsolete = is_obsolete; rule->obsolete = is_obsolete;
if (is_obsolete && rule->refs == 0) { if (is_obsolete && rule->refs == 0) {
od_list_unlink(&rule->link); od_rules_rule_free(rule);
od_list_init(&rule->link);
od_list_append(deleted, &rule->link);
count_deleted++; count_deleted++;
count_mark--; count_mark--;
} }

View File

@ -62,6 +62,27 @@ struct od_rule_auth {
od_list_t link; od_list_t link;
}; };
typedef struct od_rule_key od_rule_key_t;
struct od_rule_key {
char *usr_name;
char *db_name;
od_list_t link;
};
static inline void od_rule_key_init(od_rule_key_t *rk)
{
od_list_init(&rk->link);
}
static inline void od_rule_key_free(od_rule_key_t *rk)
{
od_list_unlink(&rk->link);
free(rk);
}
struct od_rule { struct od_rule {
/* versioning */ /* versioning */
int mark; int mark;
@ -175,9 +196,11 @@ od_rule_storage_t *od_rules_storage_copy(od_rule_storage_t *);
void od_rules_storage_free(od_rule_storage_t *); void od_rules_storage_free(od_rule_storage_t *);
#ifdef LDAP_FOUND
/* ldap endpoint */ /* ldap endpoint */
od_ldap_endpoint_t *od_rules_ldap_endpoint_add(od_rules_t *rules, od_ldap_endpoint_t *od_rules_ldap_endpoint_add(od_rules_t *rules,
od_ldap_endpoint_t *ldap); od_ldap_endpoint_t *ldap);
#endif
/* auth */ /* auth */
od_rule_auth_t *od_rules_auth_add(od_rule_t *); od_rule_auth_t *od_rules_auth_add(od_rule_t *);