]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/aclparse.c
More system schema checks
[openldap] / servers / slapd / aclparse.c
index ea1eef7e146505e91258f3b589b37813789b41a9..d93f34ce0c25a25343cb83b78fd671e91f9bd2f9 100644 (file)
@@ -1,7 +1,7 @@
 /* aclparse.c - routines to parse and check acl's */
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
@@ -204,6 +204,12 @@ parse_acl(
                                } else if ( strncasecmp( left, "attr", 4 ) == 0 ) {
                                        a->acl_attrs = str2anlist( a->acl_attrs,
                                                right, "," );
+                                       if ( a->acl_attrs == NULL ) {
+                                               fprintf( stderr,
+                               "%s: line %d: unknown attr \"%s\" in to clause\n",
+                                                   fname, lineno, right );
+                                               acl_usage();
+                                       }
                                } else {
                                        fprintf( stderr,
                                                "%s: line %d: expecting <what> got \"%s\"\n",
@@ -1275,9 +1281,10 @@ acl_free( AccessControl *a )
                filter_free( a->acl_filter );
        if ( a->acl_dn_pat.bv_len )
                free ( a->acl_dn_pat.bv_val );
-       for (; a->acl_attrs; a->acl_attrs = an) {
-               an = a->acl_attrs->an_next;
-               free( a->acl_attrs->an_name.bv_val );
+       if ( a->acl_attrs ) {
+               for ( an = a->acl_attrs; an->an_name.bv_val; an++ ) {
+                       free( an->an_name.bv_val );
+               }
                free( a->acl_attrs );
        }
        for (; a->acl_access; a->acl_access = n) {
@@ -1489,7 +1496,7 @@ print_acl( Backend *be, AccessControl *a )
                to++;
 
                fprintf( stderr, " attrs=" );
-               for ( an = a->acl_attrs; an; an=an->an_next ) {
+               for ( an = a->acl_attrs; an && an->an_name.bv_val; an++ ) {
                        if ( ! first ) {
                                fprintf( stderr, "," );
                        }