From: Alan T. DeKok Date: Fri, 13 Apr 2012 14:58:54 +0000 (+0200) Subject: Added "instance" to xlat_unregister X-Git-Tag: release_3_0_0_beta0~233 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2498108d98afa9919b2ce6940820493973ac1bab;p=thirdparty%2Ffreeradius-server.git Added "instance" to xlat_unregister This is so that on HUP, a module can re-register, and over-ride the old value. When the old module is deleted, it de-registers its xlat. But because the instance is now different, it doesn't delete the *new* xlat --- diff --git a/src/include/radiusd.h b/src/include/radiusd.h index a0012058d96..f247cfab98b 100644 --- a/src/include/radiusd.h +++ b/src/include/radiusd.h @@ -716,7 +716,8 @@ int radius_xlat(char * out, int outlen, const char *fmt, typedef size_t (*RAD_XLAT_FUNC)(void *instance, REQUEST *, char *, char *, size_t, RADIUS_ESCAPE_STRING func); int xlat_register(const char *module, RAD_XLAT_FUNC func, void *instance); -void xlat_unregister(const char *module, RAD_XLAT_FUNC func); +void xlat_unregister(const char *module, RAD_XLAT_FUNC func, + void *instance); void xlat_free(void); /* threads.c */ diff --git a/src/main/xlat.c b/src/main/xlat.c index 990bdf1e7f5..92c6ab52c45 100644 --- a/src/main/xlat.c +++ b/src/main/xlat.c @@ -883,9 +883,9 @@ int xlat_register(const char *module, RAD_XLAT_FUNC func, void *instance) * @param func Unused * @return Void. */ -void xlat_unregister(const char *module, RAD_XLAT_FUNC func) +void xlat_unregister(const char *module, RAD_XLAT_FUNC func, void *instance) { - rbnode_t *node; + xlat_t *c; xlat_t my_xlat; func = func; /* -Wunused */ @@ -895,10 +895,12 @@ void xlat_unregister(const char *module, RAD_XLAT_FUNC func) strlcpy(my_xlat.module, module, sizeof(my_xlat.module)); my_xlat.length = strlen(my_xlat.module); - node = rbtree_find(xlat_root, &my_xlat); - if (!node) return; + c = rbtree_finddata(xlat_root, &my_xlat); + if (!c) return; + + if (c->instance != instance) return; - rbtree_delete(xlat_root, node); + rbtree_deletebydata(xlat_root, c); } /** diff --git a/src/modules/rlm_exec/rlm_exec.c b/src/modules/rlm_exec/rlm_exec.c index 1dcc38665bf..9d8298cc497 100644 --- a/src/modules/rlm_exec/rlm_exec.c +++ b/src/modules/rlm_exec/rlm_exec.c @@ -162,7 +162,7 @@ static int exec_detach(void *instance) rlm_exec_t *inst = instance; if (inst->xlat_name) { - xlat_unregister(inst->xlat_name, exec_xlat); + xlat_unregister(inst->xlat_name, exec_xlat, instance); free(inst->xlat_name); } diff --git a/src/modules/rlm_expr/rlm_expr.c b/src/modules/rlm_expr/rlm_expr.c index b98afa775bb..abd3e285d26 100644 --- a/src/modules/rlm_expr/rlm_expr.c +++ b/src/modules/rlm_expr/rlm_expr.c @@ -337,7 +337,7 @@ static int expr_detach(void *instance) { rlm_expr_t *inst = instance; - xlat_unregister(inst->xlat_name, expr_xlat); + xlat_unregister(inst->xlat_name, expr_xlat, instance); pair_builtincompare_detach(); free(inst->xlat_name); diff --git a/src/modules/rlm_ldap/rlm_ldap.c b/src/modules/rlm_ldap/rlm_ldap.c index 6d53e1db6b1..91d367a971e 100644 --- a/src/modules/rlm_ldap/rlm_ldap.c +++ b/src/modules/rlm_ldap/rlm_ldap.c @@ -2596,7 +2596,7 @@ ldap_detach(void *instance) free(inst->atts); paircompare_unregister(PW_LDAP_GROUP, ldap_groupcmp); - xlat_unregister(inst->xlat_name,ldap_xlat); + xlat_unregister(inst->xlat_name,ldap_xlat, instance); free(inst->xlat_name); free(inst); diff --git a/src/modules/rlm_mschap/rlm_mschap.c b/src/modules/rlm_mschap/rlm_mschap.c index 7e8be0c537d..8496aa62fdd 100644 --- a/src/modules/rlm_mschap/rlm_mschap.c +++ b/src/modules/rlm_mschap/rlm_mschap.c @@ -582,7 +582,7 @@ static const CONF_PARSER module_config[] = { static int mschap_detach(void *instance){ #define inst ((rlm_mschap_t *)instance) if (inst->xlat_name) { - xlat_unregister(inst->xlat_name, mschap_xlat); + xlat_unregister(inst->xlat_name, mschap_xlat, instance); free(inst->xlat_name); } free(instance); diff --git a/src/modules/rlm_perl/rlm_perl.c b/src/modules/rlm_perl/rlm_perl.c index 61411c4ca31..1b410b2d027 100644 --- a/src/modules/rlm_perl/rlm_perl.c +++ b/src/modules/rlm_perl/rlm_perl.c @@ -1000,7 +1000,7 @@ static int perl_detach(void *instance) } } - xlat_unregister(inst->xlat_name, perl_xlat); + xlat_unregister(inst->xlat_name, perl_xlat, instance); free(inst->xlat_name); #ifdef USE_ITHREADS diff --git a/src/modules/rlm_redis/rlm_redis.c b/src/modules/rlm_redis/rlm_redis.c index 144f319faea..958c125e96a 100644 --- a/src/modules/rlm_redis/rlm_redis.c +++ b/src/modules/rlm_redis/rlm_redis.c @@ -232,7 +232,7 @@ static int redis_detach(void *instance) fr_connection_pool_delete(inst->pool); if (inst->xlat_name) { - xlat_unregister(inst->xlat_name, (RAD_XLAT_FUNC)redis_xlat); + xlat_unregister(inst->xlat_name, (RAD_XLAT_FUNC)redis_xlat, instance); free(inst->xlat_name); } free(inst->xlat_name); diff --git a/src/modules/rlm_soh/rlm_soh.c b/src/modules/rlm_soh/rlm_soh.c index 4f3d673b3cc..1e459f9fa6b 100644 --- a/src/modules/rlm_soh/rlm_soh.c +++ b/src/modules/rlm_soh/rlm_soh.c @@ -108,7 +108,7 @@ static int soh_detach(void *instance) { rlm_soh_t *inst = instance; if (inst->xlat_name) { - xlat_unregister(inst->xlat_name, soh_xlat); + xlat_unregister(inst->xlat_name, soh_xlat, instance); free(inst->xlat_name); } free(instance); diff --git a/src/modules/rlm_sql/rlm_sql.c b/src/modules/rlm_sql/rlm_sql.c index 2fc0684fbb4..36a67bfdd42 100644 --- a/src/modules/rlm_sql/rlm_sql.c +++ b/src/modules/rlm_sql/rlm_sql.c @@ -804,7 +804,7 @@ static int rlm_sql_detach(void *instance) if (inst->pool) sql_poolfree(inst); if (inst->config->xlat_name) { - xlat_unregister(inst->config->xlat_name,(RAD_XLAT_FUNC)sql_xlat); + xlat_unregister(inst->config->xlat_name,(RAD_XLAT_FUNC)sql_xlat, instance); free(inst->config->xlat_name); }