]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/extended.c
add a giant mutex around the ldapinfo structure to serialize chaining (need to check...
[openldap] / servers / slapd / back-ldap / extended.c
index 070466ae0355ec1f3059dcfd83af98c6e37f1188..fde2c489b013af76e0cd0ab009216fb2aa52f5e4 100644 (file)
 BI_op_extended ldap_back_exop_passwd;
 
 static struct exop {
-       struct berval   *oid;
+       struct berval   oid;
        BI_op_extended  *extended;
 } exop_table[] = {
-       { (struct berval *)&slap_EXOP_MODIFY_PASSWD, ldap_back_exop_passwd },
-       { NULL, NULL }
+       { BER_BVC(LDAP_EXOP_MODIFY_PASSWD), ldap_back_exop_passwd },
+       { BER_BVNULL, NULL }
 };
 
 int
@@ -46,7 +46,7 @@ ldap_back_extended(
        int     i;
 
        for ( i = 0; exop_table[i].extended != NULL; i++ ) {
-               if ( bvmatch( exop_table[i].oid, &op->oq_extended.rs_reqoid ) )
+               if ( bvmatch( &exop_table[i].oid, &op->oq_extended.rs_reqoid ) )
                {
                        struct ldapconn *lc;
                        LDAPControl     **oldctrls = NULL;
@@ -135,6 +135,14 @@ retry:
                                        (char **)&rs->sr_matched,
                                        (char **)&rs->sr_text,
                                        NULL, NULL, 0 );
+                       if ( rs->sr_matched && rs->sr_matched[ 0 ] == '\0' ) {
+                               free( (char *)rs->sr_matched );
+                               rs->sr_matched = NULL;
+                       }
+                       if ( rs->sr_text && rs->sr_text[ 0 ] == '\0' ) {
+                               free( (char *)rs->sr_text );
+                               rs->sr_text = NULL;
+                       }
                        if ( rc == LDAP_SUCCESS ) {
                                if ( rs->sr_err == LDAP_SUCCESS ) {
                                        struct berval   newpw;
@@ -165,15 +173,17 @@ retry:
                        }
                }
                send_ldap_result( op, rs );
-               if ( rs->sr_matched ) {
-                       free( (char *)rs->sr_matched );
-               }
-               if ( rs->sr_text ) {
-                       free( (char *)rs->sr_text );
-               }
+               rc = -1;
+       }
+
+       /* these have to be freed anyway... */
+       if ( rs->sr_matched ) {
+               free( (char *)rs->sr_matched );
                rs->sr_matched = NULL;
+       }
+       if ( rs->sr_text ) {
+               free( (char *)rs->sr_text );
                rs->sr_text = NULL;
-               rc = -1;
        }
 
        if ( lc != NULL ) {