]> git.sur5r.net Git - openldap/commitdiff
Added acl_destroy, acl_free.
authorHoward Chu <hyc@openldap.org>
Sat, 15 Dec 2001 12:41:53 +0000 (12:41 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 15 Dec 2001 12:41:53 +0000 (12:41 +0000)
servers/slapd/aclparse.c
servers/slapd/backend.c
servers/slapd/config.c
servers/slapd/proto-slap.h

index 00c93c23b1ea036d99c88214c4cd57981883ffd9..eaf3e0cdac3bab7227d7af2809c1dd342cef6b3a 100644 (file)
@@ -1217,6 +1217,62 @@ acl_append( AccessControl **l, AccessControl *a )
        *l = a;
 }
 
+static void
+access_free( Access *a )
+{
+       if ( a->a_dn_pat )
+               free ( a->a_dn_pat );
+       if ( a->a_peername_pat )
+               free ( a->a_peername_pat );
+       if ( a->a_sockname_pat )
+               free ( a->a_sockname_pat );
+       if ( a->a_domain_pat )
+               free ( a->a_domain_pat );
+       if ( a->a_sockurl_pat )
+               free ( a->a_sockurl_pat );
+       if ( a->a_set_pat )
+               free ( a->a_set_pat );
+       if ( a->a_group_pat )
+               free ( a->a_group_pat );
+       free( a );
+}
+
+void
+acl_free( AccessControl *a )
+{
+       Access *n;
+
+       if ( a->acl_filter )
+               filter_free( a->acl_filter );
+       if ( a->acl_dn_pat )
+               free ( a->acl_dn_pat );
+       if ( a->acl_attrs )
+               charray_free( a->acl_attrs );
+       for (; a->acl_access; a->acl_access = n) {
+               n = a->acl_access->a_next;
+               access_free( a->acl_access );
+       }
+       free( a );
+}
+
+/* Because backend_startup uses acl_append to tack on the global_acl to
+ * the end of each backend's acl, we cannot just take one argument and
+ * merrily free our way to the end of the list. backend_destroy calls us
+ * with the be_acl in arg1, and global_acl in arg2 to give us a stopping
+ * point. config_destroy calls us with global_acl in arg1 and NULL in
+ * arg2, so we then proceed to polish off the global_acl.
+ */
+void
+acl_destroy( AccessControl *a, AccessControl *end )
+{
+       AccessControl *n;
+
+       for (; a && a!= end; a=n) {
+               n = a->acl_next;
+               acl_free( a );
+       }
+}
+
 char *
 access2str( slap_access_t access )
 {
index 5398d8e21ddcb7389382859308fe15530bada5f3..6054ff89e27fde0a7e83c9e86f3c66c1a360cb83 100644 (file)
@@ -422,6 +422,7 @@ int backend_destroy(void)
                free( backendDB[i].be_root_dn );
                free( backendDB[i].be_root_ndn );
                free( backendDB[i].be_root_pw.bv_val );
+               acl_destroy( backendDB[i].be_acl, global_acl );
        }
        free( backendDB );
 
index 1cbb00fcf3e8753d21436c33cb8e04f704ea8172..52eca16169c1919c3154d86df343b7cabbee815a 100644 (file)
@@ -2382,4 +2382,5 @@ config_destroy( )
                free ( slapd_args_file );
        if ( slapd_pid_file )
                free ( slapd_pid_file );
+       acl_destroy( global_acl, NULL );
 }
index 5571ec2fb6b2fc258cb6c0d5195d8d542746fd0d..7b3c9a088ba17fdfb49c9fbefa89963d8792a3ec 100644 (file)
@@ -81,6 +81,8 @@ LDAP_SLAPD_F (slap_access_t) str2access LDAP_P(( const char *str ));
 #define ACCESSMASK_MAXLEN      sizeof("unknown (+wrscan)")
 LDAP_SLAPD_F (char *) accessmask2str LDAP_P(( slap_mask_t mask, char* ));
 LDAP_SLAPD_F (slap_mask_t) str2accessmask LDAP_P(( const char *str ));
+LDAP_SLAPD_F (void) acl_destroy LDAP_P(( AccessControl*, AccessControl* ));
+LDAP_SLAPD_F (void) acl_free LDAP_P(( AccessControl *a ));
 
 /*
  * at.c