]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/init.c
benign buffer overflow fix (ITS#1964)
[openldap] / servers / slapd / back-sql / init.c
index 3d4e30242fbbda57de828d00eec374d8b2a62a57..1fd5512711cac6c5701061d4b64676661308d7bd 100644 (file)
@@ -43,6 +43,18 @@ int
 sql_back_initialize(
        BackendInfo     *bi )
 { 
+       static char *controls[] = {
+#ifdef LDAP_CONTROL_NOOP
+               LDAP_CONTROL_NOOP,
+#endif
+#ifdef LDAP_CONTROL_VALUESRETURNFILTER
+               LDAP_CONTROL_VALUESRETURNFILTER,
+#endif
+               NULL
+       };
+
+       bi->bi_controls = controls;
+
        Debug( LDAP_DEBUG_TRACE,"==>backsql_initialize()\n", 0, 0, 0 );
        
        bi->bi_open = 0;
@@ -276,31 +288,7 @@ backsql_db_open(
        }
 
        if ( si->children_cond.bv_val == NULL ) {
-               /*
-                * Prepare concat function for children search condition
-                */
-               struct berval   concat;
                ber_len_t       len = 0;
-               struct berval   values[] = {
-                       { sizeof( "'%,'" ) - 1, "'%,'" },
-                       { sizeof( "?" ) - 1,    "?" },
-                       { 0,                    NULL }
-               };
-
-               if ( backsql_prepare_pattern( si->concat_func, values, 
-                               &concat ) ) {
-                       Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
-                               "unable to prepare CONCAT pattern", 0, 0, 0 );
-                       return 1;
-               }
-                       
-               Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
-                       "children search SQL condition not specified "
-                       "(use \"children_cond\" directive in slapd.conf)\n", 
-                       0, 0, 0);
-
-               si->children_cond.bv_val = NULL;
-               si->children_cond.bv_len = 0;
 
                if ( si->upper_func.bv_val ) {
 
@@ -308,13 +296,12 @@ backsql_db_open(
                         * UPPER(ldap_entries.dn) LIKE UPPER(CONCAT('%,',?))
                         */
 
-                       backsql_strfcat( &si->children_cond, &len, "blbbb",
+                       backsql_strfcat( &si->children_cond, &len, "blbl",
                                        &si->upper_func,
-                                       (ber_len_t)sizeof( "(ldap_entries.dn) LIKE " ) - 1,
-                                               "(ldap_entries.dn) LIKE ",
-                                       &si->upper_func_open,
-                                       &concat,
-                                       &si->upper_func_close );
+                                       (ber_len_t)sizeof( "(ldap_entries.dn)=" ) - 1,
+                                               "(ldap_entries.dn)=",
+                                       &si->upper_func,
+                                       (ber_len_t)sizeof( "(?)" ) - 1, "(?)" );
 
                } else {
 
@@ -322,10 +309,9 @@ backsql_db_open(
                         * ldap_entries.dn LIKE CONCAT('%,',?)
                         */
 
-                       backsql_strfcat( &si->children_cond, &len, "lb",
-                                       (ber_len_t)sizeof( "ldap_entries.dn LIKE " ) - 1,
-                                               "ldap_entries.dn LIKE ",
-                                       &concat );
+                       backsql_strfcat( &si->children_cond, &len, "l",
+                                       (ber_len_t)sizeof( "ldap_entries.dn=?" ) - 1,
+                                               "ldap_entries.dn=?");
                }
                        
                Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
@@ -433,8 +419,9 @@ backsql_db_open(
 
        bv.bv_val = NULL;
        bv.bv_len = 0;
-       backsql_strfcat( &bv, &idq_len, "sb", 
-                       "select count(*) from ldap_entries where ",
+       backsql_strfcat( &bv, &idq_len, "sb",
+                       "SELECT COUNT(distinct subordinates.id) FROM ldap_entries,ldap_entries AS subordinates WHERE subordinates.parent=ldap_entries.id AND ",
+
                        &si->children_cond );
        si->has_children_query = bv.bv_val;