https://bugs.openldap.org/show_bug.cgi?id=10336

          Issue ID: 10336
           Summary: slapd crashes with segfault in mdb_delete.c on
                    non-existent tree part deletion
           Product: OpenLDAP
           Version: 2.6.9
          Hardware: All
                OS: All
            Status: UNCONFIRMED
          Keywords: needs_review
          Severity: normal
          Priority: ---
         Component: slapd
          Assignee: [email protected]
          Reporter: [email protected]
  Target Milestone: ---

slapd crashes with segfault in mdb_delete.c on non-existent tree part deletion.
Applies to 2.6.7, 2.6.8, 2.6.9

----------

Prerequisites:

----------

- mdb backend
- empty mdb database

----------

Sample reproducer:

----------

ldapdelete -x -H ldap://127.0.0.1 -w "password" -D
"cn=MyApplication,dc=Contacts,dc=MyTree" "dc=Contacts,dc=MyTree"

----------

Expected behavior:

----------

ldap_delete: No such object (32)

----------

Actual behavior:

----------

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00005566507b96e0 in mdb_delete (op=0x7f3f0c002910, rs=0x7f3f19bfd8a0) at
../../../../openldap-epel-2.6.8/openldap-2.6.8/servers/slapd/back-mdb/delete.c:151

----------

Sample slapd.conf:

----------

include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/openldap.schema

allow bind_v2

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

modulepath /usr/lib64/openldap
#moduleload back_shell.la
moduleload sssvlv.la
moduleload valsort.la

TLSCACertificatePath /etc/openldap/certs
TLSCertificateFile /etc/<path removed>.crt
TLSCertificateKeyFile /etc/<path removed>.key

database mdb
suffix "dc=Contacts,dc=MyTree"
directory "/var/lib/ldap"
checkpoint 1024 1
dbnosync
maxsize 1048576000
index objectClass eq,pres
index ou,cn eq,pres,sub
index uidNumber,gidNumber eq,pres
index uid eq,pres,sub
rootdn "cn=MyApplication,dc=Contacts,dc=MyTree"
rootpw "{SSHA}<removed>"
access to *
  by dn="cn=Phone,dc=Contacts,dc=MyTree" read
  by peername.ip=127.0.0.1 write
  by anonymous auth
  by * none
overlay sssvlv
sssvlv-max 1000
sssvlv-maxperconn 1000

----------

Sample fix:

I am not versed in OpenLDAP code so I can't tell if it's semantically correct.
Seems like "e" gets NULL in this piece of code and the piece of code does not
verify if "e" is NULL. Adding check for ( e ) makes slapd correctly return
ldap_delete: No such object (32) instead of segfaulting.

----------

--- a/servers/slapd/back-mdb/delete.c   2024-05-21 19:19:11.000000000 +0200
+++ b/servers/slapd/back-mdb/delete.c   2025-05-12 14:43:04.652396852 +0200
@@ -148,17 +148,19 @@
                        "<=- " LDAP_XSTRING(mdb_delete) ": no such object
%s\n",
                        op->o_req_dn.bv_val );

-               rs->sr_matched = ch_strdup( e->e_dn );
-               if ( is_entry_referral( e )) {
-                       BerVarray ref = get_entry_referrals( op, e );
-                       rs->sr_ref = referral_rewrite( ref, &e->e_name,
-                               &op->o_req_dn, LDAP_SCOPE_DEFAULT );
-                       ber_bvarray_free( ref );
-               } else {
-                       rs->sr_ref = NULL;
+               if ( e ) {
+                       rs->sr_matched = ch_strdup( e->e_dn );
+                       if ( is_entry_referral( e )) {
+                               BerVarray ref = get_entry_referrals( op, e );
+                               rs->sr_ref = referral_rewrite( ref, &e->e_name,
+                                       &op->o_req_dn, LDAP_SCOPE_DEFAULT );
+                               ber_bvarray_free( ref );
+                       } else {
+                               rs->sr_ref = NULL;
+                       }
+                       mdb_entry_return( op, e );
+                       e = NULL;
                }
-               mdb_entry_return( op, e );
-               e = NULL;

                rs->sr_err = LDAP_REFERRAL;
                rs->sr_flags = REP_MATCHED_MUSTBEFREED | REP_REF_MUSTBEFREED;

-- 
You are receiving this mail because:
You are on the CC list for the issue.

Reply via email to