Added "instance" to xlat_unregister
authorAlan T. DeKok <aland@freeradius.org>
Fri, 13 Apr 2012 14:58:54 +0000 (16:58 +0200)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 13 Apr 2012 15:08:44 +0000 (17:08 +0200)
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

src/include/radiusd.h
src/main/xlat.c
src/modules/rlm_exec/rlm_exec.c
src/modules/rlm_expr/rlm_expr.c
src/modules/rlm_ldap/rlm_ldap.c
src/modules/rlm_mschap/rlm_mschap.c
src/modules/rlm_perl/rlm_perl.c
src/modules/rlm_redis/rlm_redis.c
src/modules/rlm_soh/rlm_soh.c
src/modules/rlm_sql/rlm_sql.c

index a001205..f247cfa 100644 (file)
@@ -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 */
index 990bdf1..92c6ab5 100644 (file)
@@ -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);
 }
 
 /**
index 1dcc386..9d8298c 100644 (file)
@@ -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);
        }
 
index b98afa7..abd3e28 100644 (file)
@@ -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);
 
index 6d53e1d..91d367a 100644 (file)
@@ -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);
index 7e8be0c..8496aa6 100644 (file)
@@ -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);
index 61411c4..1b410b2 100644 (file)
@@ -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
index 144f319..958c125 100644 (file)
@@ -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);
index 4f3d673..1e459f9 100644 (file)
@@ -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);
index 2fc0684..36a67bf 100644 (file)
@@ -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);
                }