]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schema.c
Fix memory leak.
[openldap] / servers / slapd / schema.c
index e82b8cc6002a3eb6a27d3f444577b7507b95ce34..04c6b2a92daf7bc20f4805ed5f3d88431d1eb5fd 100644 (file)
 
 #if defined( SLAPD_SCHEMA_DN )
 
-void
-schema_info( Connection *conn, Operation *op, char **attrs, int attrsonly )
+int
+schema_info( Entry **entry, const char **text )
 {
+#ifdef SLAPD_SCHEMA_NOT_COMPAT
+       AttributeDescription *ad_objectClass = slap_schema.si_ad_objectClass;
+#else
+       char *ad_objectClass = "objectClass";
+#endif
+
        Entry           *e;
        struct berval   val;
        struct berval   *vals[2];
@@ -37,17 +43,55 @@ schema_info( Connection *conn, Operation *op, char **attrs, int attrsonly )
        (void) dn_normalize( e->e_ndn );
        e->e_private = NULL;
 
+       val.bv_val = "top";
+       val.bv_len = sizeof("top")-1;
+       attr_merge( e, ad_objectClass, vals );
+
+       val.bv_val = "LDAPsubentry";
+       val.bv_len = sizeof("LDAPsubentry")-1;
+       attr_merge( e, ad_objectClass, vals );
+
+       val.bv_val = "subschema";
+       val.bv_len = sizeof("subschema")-1;
+       attr_merge( e, ad_objectClass, vals );
+
+       val.bv_val = "extensibleObject";
+       val.bv_len = sizeof("extensibleObject")-1;
+       attr_merge( e, ad_objectClass, vals );
+
        {
+#ifdef SLAPD_SCHEMA_NOT_COMPAT
+               int rc;
+               AttributeDescription *desc = NULL;
+#else
+               char *desc;
+#endif
                char *rdn = ch_strdup( SLAPD_SCHEMA_DN );
                val.bv_val = strchr( rdn, '=' );
 
-               if( val.bv_val != NULL ) {
-                       *val.bv_val = '\0';
-                       val.bv_len = strlen( ++val.bv_val );
+               if( val.bv_val == NULL ) {
+                       free( rdn );
+                       *text = "improperly configured subschema subentry";
+                       return LDAP_OTHER;
+               }
+
+               *val.bv_val = '\0';
+               val.bv_len = strlen( ++val.bv_val );
+
+#ifdef SLAPD_SCHEMA_NOT_COMPAT
+               rc = slap_str2ad( rdn, &desc, text );
 
-                       attr_merge( e, rdn, vals );
+               if( rc != LDAP_SUCCESS ) {
+                       free( rdn );
+                       entry_free( e );
+                       *text = "improperly configured subschema subentry";
+                       return LDAP_OTHER;
                }
+#else
+               desc = rdn;
+#endif
 
+               attr_merge( e, desc, vals );
                free( rdn );
        }
 
@@ -58,33 +102,12 @@ schema_info( Connection *conn, Operation *op, char **attrs, int attrsonly )
        {
                /* Out of memory, do something about it */
                entry_free( e );
-               send_ldap_result( conn, op, LDAP_OTHER,
-                       NULL, "out of memory", NULL, NULL );
-               return;
+               *text = "out of memory";
+               return LDAP_OTHER;
        }
        
-       val.bv_val = "top";
-       val.bv_len = sizeof("top")-1;
-       attr_merge( e, "objectClass", vals );
-
-       val.bv_val = "LDAPsubentry";
-       val.bv_len = sizeof("LDAPsubentry")-1;
-       attr_merge( e, "objectClass", vals );
-
-       val.bv_val = "subschema";
-       val.bv_len = sizeof("subschema")-1;
-       attr_merge( e, "objectClass", vals );
-
-       val.bv_val = "extensibleObject";
-       val.bv_len = sizeof("extensibleObject")-1;
-       attr_merge( e, "objectClass", vals );
-
-       send_search_entry( &backends[0], conn, op,
-               e, attrs, attrsonly, NULL );
-       send_search_result( conn, op, LDAP_SUCCESS,
-               NULL, NULL, NULL, NULL, 1 );
-
-       entry_free( e );
+       *entry = e;
+       return LDAP_SUCCESS;
 }
 #endif