]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/valsort.c
check for NULL backend (ITS#6490)
[openldap] / servers / slapd / overlays / valsort.c
index 5cc06cfaf0acdbe7d4300c826e438f9f82cbe722..53a2e9192535da475250b2de2277f6e8c8085861 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2005-2007 The OpenLDAP Foundation.
+ * Copyright 2005-2009 The OpenLDAP Foundation.
  * Portions copyright 2005 Symas Corporation.
  * All rights reserved.
  *
@@ -152,13 +152,13 @@ valsort_cf_func(ConfigArgs *c) {
        vitmp.vi_ad = NULL;
        i = slap_str2ad( c->argv[1], &vitmp.vi_ad, &text );
        if ( i ) {
-               sprintf( c->cr_msg, "<%s> %s", c->argv[0], text );
+               snprintf( c->cr_msg, sizeof( c->cr_msg), "<%s> %s", c->argv[0], text );
                Debug( LDAP_DEBUG_ANY, "%s: %s (%s)!\n",
                        c->log, c->cr_msg, c->argv[1] );
                return(1);
        }
        if ( is_at_single_value( vitmp.vi_ad->ad_type )) {
-               sprintf( c->cr_msg, "<%s> %s is single-valued, ignoring", c->argv[0],
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> %s is single-valued, ignoring", c->argv[0],
                        vitmp.vi_ad->ad_cname.bv_val );
                Debug( LDAP_DEBUG_ANY, "%s: %s (%s)!\n",
                        c->log, c->cr_msg, c->argv[1] );
@@ -170,14 +170,14 @@ valsort_cf_func(ConfigArgs *c) {
        ber_str2bv( c->argv[2], 0, 0, &bv );
        i = dnNormalize( 0, NULL, NULL, &bv, &vitmp.vi_dn, NULL );
        if ( i ) {
-               sprintf( c->cr_msg, "<%s> unable to normalize DN", c->argv[0] );
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> unable to normalize DN", c->argv[0] );
                Debug( LDAP_DEBUG_ANY, "%s: %s (%s)!\n",
                        c->log, c->cr_msg, c->argv[2] );
                return(1);
        }
        i = verb_to_mask( c->argv[3], sorts );
        if ( BER_BVISNULL( &sorts[i].word )) {
-               sprintf( c->cr_msg, "<%s> unrecognized sort type", c->argv[0] );
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> unrecognized sort type", c->argv[0] );
                Debug( LDAP_DEBUG_ANY, "%s: %s (%s)!\n",
                        c->log, c->cr_msg, c->argv[3] );
                return(1);
@@ -186,7 +186,7 @@ valsort_cf_func(ConfigArgs *c) {
        if ( sorts[i].mask == VALSORT_WEIGHTED && c->argc == 5 ) {
                i = verb_to_mask( c->argv[4], sorts );
                if ( BER_BVISNULL( &sorts[i].word )) {
-                       sprintf( c->cr_msg, "<%s> unrecognized sort type", c->argv[0] );
+                       snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> unrecognized sort type", c->argv[0] );
                        Debug( LDAP_DEBUG_ANY, "%s: %s (%s)!\n",
                                c->log, c->cr_msg, c->argv[4] );
                        return(1);
@@ -194,7 +194,7 @@ valsort_cf_func(ConfigArgs *c) {
                vitmp.vi_sort |= sorts[i].mask;
        }
        if (( vitmp.vi_sort & VALSORT_NUMERIC ) && !is_numeric ) {
-               sprintf( c->cr_msg, "<%s> numeric sort specified for non-numeric syntax",
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> numeric sort specified for non-numeric syntax",
                        c->argv[0] );
                Debug( LDAP_DEBUG_ANY, "%s: %s (%s)!\n",
                        c->log, c->cr_msg, c->argv[1] );
@@ -297,9 +297,19 @@ valsort_response( Operation *op, SlapReply *rs )
                a = attr_find( rs->sr_entry->e_attrs, vi->vi_ad );
                if ( !a ) continue;
 
-               if (( rs->sr_flags & ( REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED )) !=
-                       ( REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED )) {
-                       rs->sr_entry = entry_dup( rs->sr_entry );
+               if (( rs->sr_flags & ( REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED ) ) !=
+                       ( REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED ) )
+               {
+                       Entry *e;
+
+                       e = entry_dup( rs->sr_entry );
+                       if ( rs->sr_flags & REP_ENTRY_MUSTRELEASE ) {
+                               overlay_entry_release_ov( op, rs->sr_entry, 0, on );
+                               rs->sr_flags &= ~REP_ENTRY_MUSTRELEASE;
+                       } else if ( rs->sr_flags & REP_ENTRY_MUSTBEFREED ) {
+                               entry_free( rs->sr_entry );
+                       }
+                       rs->sr_entry = e;
                        rs->sr_flags |= REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED;
                        a = attr_find( rs->sr_entry->e_attrs, vi->vi_ad );
                }