Control: tags -1 confirmed

On 2025-05-26 20:08:43 -0700, Ryan Tandy wrote:
> Package: release.debian.org
> Severity: normal
> User: release.debian....@packages.debian.org
> Usertags: unblock
> X-Debbugs-Cc: pkg-openldap-de...@lists.alioth.debian.org
> Control: affects -1 src:openldap
> 
> For OpenLDAP in trixie, I would like to try following upstream's 2.6 LTS 
> release series.

Please go ahead.

Cheers

> 
> Ubuntu have been doing this for a couple of years already, starting with 
> the 2.5 LTS series, without regrets as far as I know.
> 
> - Policy: https://wiki.ubuntu.com/OpenLDAPUpdates
> - Recent upload (2.5.19): https://bugs.launchpad.net/bugs/2085192
> 
> The OpenLDAP release manager reviews each change and decides which 
> changes to backport to stable releases. The release policy is slightly 
> less strict than Debian: stable releases are frozen to significant 
> features and compatibility breaks, but can include minor fixes or 
> additions if they are judged to be low risk.
> 
> The full release policy is here:
> https://lists.openldap.org/hyperkitty/list/openldap-annou...@openldap.org/thread/2QQNVWPUUG54JM7FGQHMMF3H4KS2PPKQ/
> 
> Upstream developers are active and react quickly to actionable 
> regression reports. The release manager is subscribed to the 
> pkg-openldap-devel mailing list and reads our bug reports.
> 
> Upstream QA includes:
> 
> - an extensive functional test suite
> - a regression test suite (relatively new, but growing)
> - upcoming releases are pre-announced and tested by the community before 
>   release
> 
> On the Debian side:
> 
> - the functional test suite is run during build
> - the regression suite is not (because the build time is already long)
> - the package has only superficial autopkgtests, consisting of a few 
>   smoke tests and regression tests
> - reverse dependencies' autopkgtests contribute more coverage
> 
> The client library (libldap) is installed on most Debian systems, but it 
> is mature and doesn't change much. The server (slapd) has most of the 
> development activity, but fewer users.
> 
> The debdiff for the 2.6.10 update is attached.
> 
> Thank you for considering,
> Ryan

> diff -Nru openldap-2.6.9+dfsg/CHANGES openldap-2.6.10+dfsg/CHANGES
> --- openldap-2.6.9+dfsg/CHANGES       2024-11-26 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/CHANGES      2025-05-22 10:56:21.000000000 -0700
> @@ -1,5 +1,32 @@
>  OpenLDAP 2.6 Change Log
>  
> +OpenLDAP 2.6.10 Release (2025/05/22)
> +     Added slapd microsecond timestamp format for local logging (ITS#10140)
> +     Fixed libldap ldap_result behavior with LDAP_MSG_RECEIVED (ITS#10229)
> +     Fixed lloadd handling of starttls critical (ITS#10323)
> +     Fixed slapd syncrepl when used with slapo-rwm (ITS#10290)
> +     Fixed slapd regression with certain searches (ITS#10307)
> +     Fixed slapo-autoca olcAutoCAserverClass object (ITS#10288)
> +     Fixed slapo-pcache caching behaviors (ITS#10270)
> +     Minor Cleanup
> +             ITS#7080
> +             ITS#7249
> +             ITS#9934
> +             ITS#10020
> +             ITS#10168
> +             ITS#10226
> +             ITS#10279
> +             ITS#10299
> +             ITS#10302
> +             ITS#10309
> +             ITS#10312
> +             ITS#10320
> +             ITS#10325
> +             ITS#10327
> +             ITS#10328
> +             ITS#10331
> +             ITS#10336
> +
>  OpenLDAP 2.6.9 Release (2024/11/26)
>       Fixed libldap TLS connection timeout handling (ITS#8047)
>       Fixed libldap GnuTLS incompatible pointer type (ITS#10253)
> diff -Nru openldap-2.6.9+dfsg/build/version.var 
> openldap-2.6.10+dfsg/build/version.var
> --- openldap-2.6.9+dfsg/build/version.var     2024-11-26 09:11:04.000000000 
> -0800
> +++ openldap-2.6.10+dfsg/build/version.var    2025-05-22 10:56:21.000000000 
> -0700
> @@ -15,9 +15,9 @@
>  ol_package=OpenLDAP
>  ol_major=2
>  ol_minor=6
> -ol_patch=9
> -ol_api_inc=20609
> +ol_patch=10
> +ol_api_inc=20610
>  ol_api_current=2
>  ol_api_revision=200
>  ol_api_age=0
> -ol_release_date="2024/11/26"
> +ol_release_date="2025/05/22"
> diff -Nru openldap-2.6.9+dfsg/clients/tools/common.c 
> openldap-2.6.10+dfsg/clients/tools/common.c
> --- openldap-2.6.9+dfsg/clients/tools/common.c        2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/clients/tools/common.c       2025-05-22 
> 10:56:21.000000000 -0700
> @@ -780,6 +780,9 @@
>                               exit( EXIT_FAILURE );
>                       }
>                       ldapuri = ber_strdup( optarg );
> +                     if ( ldapuri == NULL ) {
> +                             exit( EXIT_FAILURE );
> +                     }
>                       break;
>               case 'I':
>  #ifdef HAVE_CYRUS_SASL
> @@ -980,6 +983,9 @@
>                       break;
>               case 'w':       /* password */
>                       passwd.bv_val = ber_strdup( optarg );
> +                     if ( passwd.bv_val == NULL ) {
> +                             exit( EXIT_FAILURE );
> +                     }
>                       {
>                               char* p;
>  
> @@ -1166,6 +1172,7 @@
>       LDAP *ld = NULL;
>  
>       if ( debug ) {
> +#ifdef LDAP_DEBUG
>               if( ber_set_option( NULL, LBER_OPT_DEBUG_LEVEL, &debug )
>                       != LBER_OPT_SUCCESS )
>               {
> @@ -1178,6 +1185,10 @@
>                       fprintf( stderr,
>                               "Could not set LDAP_OPT_DEBUG_LEVEL %d\n", 
> debug );
>               }
> +#else /* !LDAP_DEBUG */
> +             fprintf( stderr,
> +                             "Must compile with LDAP_DEBUG for debugging\n", 
> prog );
> +#endif /* !LDAP_DEBUG */
>       }
>  
>  #ifdef SIGPIPE
> @@ -1476,6 +1487,9 @@
>                               tool_exit( ld, EXIT_FAILURE );
>                       }
>                       passwd.bv_val = ber_strdup( pw );
> +                     if ( passwd.bv_val == NULL ) {
> +                             tool_exit( ld, EXIT_FAILURE );
> +                     }
>                       passwd.bv_len = strlen( passwd.bv_val );
>               }
>       }
> diff -Nru openldap-2.6.9+dfsg/clients/tools/ldapvc.c 
> openldap-2.6.10+dfsg/clients/tools/ldapvc.c
> --- openldap-2.6.9+dfsg/clients/tools/ldapvc.c        2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/clients/tools/ldapvc.c       2025-05-22 
> 10:56:21.000000000 -0700
> @@ -165,6 +165,9 @@
>                       }
>  
>                       vc_sasl_mech = ber_strdup(cvalue);
> +                     if (vc_sasl_mech == NULL) {
> +                             exit(EXIT_FAILURE);
> +                     }
>  #else
>  #endif
>  
> @@ -182,6 +185,9 @@
>                       }
>  
>                       vc_sasl_realm = ber_strdup(cvalue);
> +                     if (vc_sasl_realm == NULL) {
> +                             exit(EXIT_FAILURE);
> +                     }
>  #else
>                       fprintf(stderr,
>                               _("%s: not compiled with SASL support\n"), 
> prog);
> @@ -202,6 +208,9 @@
>                       }
>  
>                       vc_sasl_authcid = ber_strdup(cvalue);
> +                     if (vc_sasl_authcid == NULL) {
> +                             exit(EXIT_FAILURE);
> +                     }
>  #else
>                       fprintf(stderr,
>                               _("%s: not compiled with SASL support\n"), 
> prog);
> @@ -222,6 +231,9 @@
>                       }
>  
>                       vc_sasl_authzid = ber_strdup(cvalue);
> +                     if (vc_sasl_authzid == NULL) {
> +                             exit(EXIT_FAILURE);
> +                     }
>  #else
>                       fprintf(stderr,
>                               _("%s: not compiled with SASL support\n"), 
> prog);
> @@ -242,6 +254,9 @@
>                       }
>  
>                       vc_sasl_secprops = ber_strdup(cvalue);
> +                     if (vc_sasl_secprops == NULL) {
> +                             exit(EXIT_FAILURE);
> +                     }
>  #else
>                       fprintf(stderr,
>                               _("%s: not compiled with SASL support\n"), 
> prog);
> diff -Nru openldap-2.6.9+dfsg/contrib/slapd-modules/autogroup/autogroup.c 
> openldap-2.6.10+dfsg/contrib/slapd-modules/autogroup/autogroup.c
> --- openldap-2.6.9+dfsg/contrib/slapd-modules/autogroup/autogroup.c   
> 2024-11-26 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/contrib/slapd-modules/autogroup/autogroup.c  
> 2025-05-22 10:56:21.000000000 -0700
> @@ -529,6 +529,7 @@
>       o.ors_attrs =  agf->agf_anlist ? agf->agf_anlist : slap_anlist_no_attrs;
>       o.o_do_not_cache = 1;
>       o.o_abandon = 0;
> +     o.o_managedsait = SLAP_CONTROL_NONCRITICAL;
>  
>       agg.agg_group = age;
>       agg.agg_filter = agf;
> @@ -2130,6 +2131,7 @@
>       op->ors_slimit = SLAP_NO_LIMIT;
>       op->ors_attrs =  slap_anlist_no_attrs;
>       op->o_do_not_cache = 1;
> +     op->o_managedsait = SLAP_CONTROL_CRITICAL;
>  
>       op->o_bd = be;
>       op->o_bd->bd_info = (BackendInfo *)on->on_info;
> diff -Nru openldap-2.6.9+dfsg/contrib/slapd-modules/variant/variant.c 
> openldap-2.6.10+dfsg/contrib/slapd-modules/variant/variant.c
> --- openldap-2.6.9+dfsg/contrib/slapd-modules/variant/variant.c       
> 2024-11-26 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/contrib/slapd-modules/variant/variant.c      
> 2025-05-22 10:56:21.000000000 -0700
> @@ -696,7 +696,7 @@
>       { "passReplication", "on|off", 2, 2, 0,
>               ARG_ON_OFF|ARG_OFFSET,
>               (void *)offsetof( variant_info_t, passReplication ),
> -             "( OLcfgOvAt:9.1 NAME 'olcVariantPassReplication' "
> +             "( OLcfgCtAt:9.1 NAME 'olcVariantPassReplication' "
>                       "DESC 'Whether to let searches with replication control 
> "
>                               "pass unmodified' "
>                       "SYNTAX OMsBoolean "
> @@ -706,7 +706,7 @@
>       { "variantDN", "dn", 2, 2, 0,
>               ARG_DN|ARG_QUOTE|ARG_MAGIC,
>               variant_set_dn,
> -             "( OLcfgOvAt:9.2 NAME 'olcVariantEntry' "
> +             "( OLcfgCtAt:9.2 NAME 'olcVariantEntry' "
>                       "DESC 'DN of the variant entry' "
>                       "EQUALITY distinguishedNameMatch "
>                       "SYNTAX OMsDN "
> @@ -716,7 +716,7 @@
>       { "variantRegex", "regex", 2, 2, 0,
>               ARG_BERVAL|ARG_QUOTE|ARG_MAGIC,
>               variant_set_regex,
> -             "( OLcfgOvAt:9.6 NAME 'olcVariantEntryRegex' "
> +             "( OLcfgCtAt:9.6 NAME 'olcVariantEntryRegex' "
>                       "DESC 'Pattern for the variant entry' "
>                       "EQUALITY caseExactMatch "
>                       "SYNTAX OMsDirectoryString "
> @@ -727,7 +727,7 @@
>       { "", NULL, 2, 2, 0,
>               ARG_STRING|ARG_MAGIC|VARIANT_ATTR,
>               variant_set_attribute,
> -             "( OLcfgOvAt:9.3 NAME 'olcVariantVariantAttribute' "
> +             "( OLcfgCtAt:9.3 NAME 'olcVariantVariantAttribute' "
>                       "DESC 'Attribute to fill in the entry' "
>                       "EQUALITY caseIgnoreMatch "
>                       "SYNTAX OMsDirectoryString "
> @@ -737,7 +737,7 @@
>       { "", NULL, 2, 2, 0,
>               ARG_STRING|ARG_MAGIC|VARIANT_ATTR_ALT,
>               variant_set_attribute,
> -             "( OLcfgOvAt:9.4 NAME 'olcVariantAlternativeAttribute' "
> +             "( OLcfgCtAt:9.4 NAME 'olcVariantAlternativeAttribute' "
>                       "DESC 'Attribute to take from the alternative entry' "
>                       "EQUALITY caseIgnoreMatch "
>                       "SYNTAX OMsDirectoryString "
> @@ -747,7 +747,7 @@
>       { "", NULL, 2, 2, 0,
>               ARG_DN|ARG_QUOTE|ARG_MAGIC,
>               variant_set_alt_dn,
> -             "( OLcfgOvAt:9.5 NAME 'olcVariantAlternativeEntry' "
> +             "( OLcfgCtAt:9.5 NAME 'olcVariantAlternativeEntry' "
>                       "DESC 'DN of the alternative entry' "
>                       "EQUALITY distinguishedNameMatch "
>                       "SYNTAX OMsDN "
> @@ -757,7 +757,7 @@
>       { "", NULL, 2, 2, 0,
>               ARG_BERVAL|ARG_QUOTE|ARG_MAGIC,
>               variant_set_alt_pattern,
> -             "( OLcfgOvAt:9.7 NAME 'olcVariantAlternativeEntryPattern' "
> +             "( OLcfgCtAt:9.7 NAME 'olcVariantAlternativeEntryPattern' "
>                       "DESC 'Replacement pattern to locate the alternative 
> entry' "
>                       "EQUALITY caseExactMatch "
>                       "SYNTAX OMsDirectoryString "
> @@ -780,13 +780,13 @@
>  };
>  
>  static ConfigOCs variant_ocs[] = {
> -     { "( OLcfgOvOc:9.1 "
> +     { "( OLcfgCtOc:9.1 "
>               "NAME 'olcVariantConfig' "
>               "DESC 'Variant overlay configuration' "
>               "SUP olcOverlayConfig "
>               "MAY ( olcVariantPassReplication ) )",
>               Cft_Overlay, variant_cfg, NULL, variant_cfadd },
> -     { "( OLcfgOvOc:9.2 "
> +     { "( OLcfgCtOc:9.2 "
>               "NAME 'olcVariantVariant' "
>               "DESC 'Variant configuration' "
>               "MUST ( olcVariantEntry ) "
> @@ -794,7 +794,7 @@
>               "SUP top "
>               "STRUCTURAL )",
>               Cft_Misc, variant_cfg, variant_ldadd },
> -     { "( OLcfgOvOc:9.3 "
> +     { "( OLcfgCtOc:9.3 "
>               "NAME 'olcVariantAttribute' "
>               "DESC 'Variant attribute description' "
>               "MUST ( olcVariantVariantAttribute $ "
> @@ -805,7 +805,7 @@
>               "SUP top "
>               "STRUCTURAL )",
>               Cft_Misc, variant_cfg, variant_attr_ldadd },
> -     { "( OLcfgOvOc:9.4 "
> +     { "( OLcfgCtOc:9.4 "
>               "NAME 'olcVariantRegex' "
>               "DESC 'Variant configuration' "
>               "MUST ( olcVariantEntryRegex ) "
> @@ -813,7 +813,7 @@
>               "SUP top "
>               "STRUCTURAL )",
>               Cft_Misc, variant_cfg, variant_regex_ldadd },
> -     { "( OLcfgOvOc:9.5 "
> +     { "( OLcfgCtOc:9.5 "
>               "NAME 'olcVariantAttributePattern' "
>               "DESC 'Variant attribute description' "
>               "MUST ( olcVariantVariantAttribute $ "
> diff -Nru openldap-2.6.9+dfsg/debian/changelog 
> openldap-2.6.10+dfsg/debian/changelog
> --- openldap-2.6.9+dfsg/debian/changelog      2025-03-11 16:27:52.000000000 
> -0700
> +++ openldap-2.6.10+dfsg/debian/changelog     2025-05-24 16:23:14.000000000 
> -0700
> @@ -1,3 +1,9 @@
> +openldap (2.6.10+dfsg-1) UNRELEASED; urgency=medium
> +
> +  * New upstream release.
> +
> + -- Ryan Tandy <r...@nardis.ca>  Sat, 24 May 2025 16:23:14 -0700
> +
>  openldap (2.6.9+dfsg-2) unstable; urgency=medium
>  
>    [ Adriano Rafael Gomes ]
> diff -Nru openldap-2.6.9+dfsg/doc/guide/admin/replication.sdf 
> openldap-2.6.10+dfsg/doc/guide/admin/replication.sdf
> --- openldap-2.6.9+dfsg/doc/guide/admin/replication.sdf       2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/doc/guide/admin/replication.sdf      2025-05-22 
> 10:56:21.000000000 -0700
> @@ -347,6 +347,10 @@
>  bring it up to date and replication then switches back to the delta-syncrepl
>  mode.
>  
> +Note: partial replication is incompatible with deltasync. For deltasync to
> +work, the replication user needs unrestricted read access to both the main
> +database and accesslog database.
> +
>  Note: since the database state is stored in both the changelog DB and the
>  main DB on the provider, it is important to backup/restore both the changelog
>  DB and the main DB using slapcat/slapadd when restoring a DB or copying
> @@ -481,9 +485,18 @@
>  must first be configured in {{slapd.conf}}(5) before it can be
>  used. The provider has two primary configuration directives and
>  two secondary directives for when delta-syncrepl is being used.
> +
>  Because the LDAP Sync search is subject to access control, proper
>  access control privileges should be set up for the replicated
> -content.
> +content. In many environments the replicas are meant to carry the
> +same data as provider so the replication user needs unrestricted
> +read access to the database and as such this tends to be the first
> +access rule for that database:
> +
> +> access to * by "$REPLICATOR" read by * break
> +
> +However if partial replication is desired, the access rules can be
> +tightened appropriately.
>  
>  The two primary options to configure are the checkpoint and
>  sessionlog behaviors.
> @@ -497,7 +510,13 @@
>  time has passed since the last checkpoint, a new checkpoint is
>  performed. Checkpointing is disabled by default.
>  
> -The session log is configured by the
> +If an accesslog is maintained for this database and contains all the
> +successful writes, it is the preferred way to provide the resync
> +information:
> +
> +> syncprov-sessionlog-source <accesslog db suffix>
> +
> +Otherwise an in memory session session log is configured by the
>  
>  >    syncprov-sessionlog <ops>
>  
> @@ -535,7 +554,7 @@
>  >
>  >    overlay syncprov
>  >    syncprov-checkpoint 100 10
> ->    syncprov-sessionlog 100
> +>    syncprov-sessionlog-source cn=accesslog
>  
>  
>  H4: Set up the consumer slapd
> diff -Nru openldap-2.6.9+dfsg/doc/guide/admin/slapdconf2.sdf 
> openldap-2.6.10+dfsg/doc/guide/admin/slapdconf2.sdf
> --- openldap-2.6.9+dfsg/doc/guide/admin/slapdconf2.sdf        2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/doc/guide/admin/slapdconf2.sdf       2025-05-22 
> 10:56:21.000000000 -0700
> @@ -1045,102 +1045,103 @@
>  E: 15.    # global database parameters
>  E: 16.    dn: olcDatabase=frontend,cn=config
>  E: 17.    objectClass: olcDatabaseConfig
> -E: 18.    olcDatabase: frontend
> -E: 19.    olcAccess: to * by * read
> -E: 20.
> +E: 18.    objectClass: olcFrontendConfig
> +E: 19.    olcDatabase: frontend
> +E: 20.    olcAccess: to * by * read
> +E: 21.
>  
>  Line 15 is a comment. Lines 16-18 identify this entry as the global
> -database entry. Line 19 is a global access control. It applies to all
> +database entry. Line 20 is a global access control. It applies to all
>  entries (after any applicable database-specific access controls).
> -Line 20 is a blank line.
> +Line 21 is a blank line.
>  
>  The next entry defines the config backend.
>  
> -E: 21.    # set a rootpw for the config database so we can bind.
> -E: 22.    # deny access to everyone else.
> -E: 23.    dn: olcDatabase=config,cn=config
> -E: 24.    objectClass: olcDatabaseConfig
> -E: 25.    olcDatabase: config
> -E: 26.    olcRootPW: {SSHA}XKYnrjvGT3wZFQrDD5040US592LxsdLy
> -E: 27.    olcAccess: to * by * none
> -E: 28.
> -
> -Lines 21-22 are comments. Lines 23-25 identify this entry as the config
> -database entry. Line 26 defines the {{super-user}} password for this
> -database. (The DN defaults to {{"cn=config"}}.) Line 27 denies all access
> +E: 22.    # set a rootpw for the config database so we can bind.
> +E: 23.    # deny access to everyone else.
> +E: 24.    dn: olcDatabase=config,cn=config
> +E: 25.    objectClass: olcDatabaseConfig
> +E: 26.    olcDatabase: config
> +E: 27.    olcRootPW: {SSHA}XKYnrjvGT3wZFQrDD5040US592LxsdLy
> +E: 28.    olcAccess: to * by * none
> +E: 29.
> +
> +Lines 22-23 are comments. Lines 24-26 identify this entry as the config
> +database entry. Line 27 defines the {{super-user}} password for this
> +database. (The DN defaults to {{"cn=config"}}.) Line 28 denies all access
>  to this database, so only the super-user will be able to access it. (This
>  is already the default access on the config database. It is just listed
>  here for illustration, and to reiterate that unless a means to authenticate
>  as the super-user is explicitly configured, the config database will be
>  inaccessible.)
>  
> -Line 28 is a blank line.
> +Line 29 is a blank line.
>  
>  The next entry defines an MDB backend that will handle queries for things
>  in the "dc=example,dc=com" portion of the tree. Indices are to be maintained
>  for several attributes, and the {{EX:userPassword}} attribute is to be
>  protected from unauthorized access.
>  
> -E: 29.    # MDB definition for example.com
> -E: 30.    dn: olcDatabase=mdb,cn=config
> -E: 31.    objectClass: olcDatabaseConfig
> -E: 32.    objectClass: olcMdbConfig
> -E: 33.    olcDatabase: mdb
> -E: 34.    olcSuffix: dc=example,dc=com
> -E: 35.    olcDbDirectory: /usr/local/var/openldap-data
> -E: 36.    olcRootDN: cn=Manager,dc=example,dc=com
> -E: 37.    olcRootPW: secret
> -E: 38.    olcDbIndex: uid pres,eq
> -E: 39.    olcDbIndex: cn,sn pres,eq,approx,sub
> -E: 40.    olcDbIndex: objectClass eq
> -E: 41.    olcAccess: to attrs=userPassword
> -E: 42.      by self write
> -E: 43.      by anonymous auth
> -E: 44.      by dn.base="cn=Admin,dc=example,dc=com" write
> -E: 45.      by * none
> -E: 46.    olcAccess: to *
> -E: 47.      by self write
> -E: 48.      by dn.base="cn=Admin,dc=example,dc=com" write
> -E: 49.      by * read
> -E: 50.
> -
> -Line 29 is a comment. Lines 30-33 identify this entry as a MDB database
> -configuration entry.  Line 34 specifies the DN suffix
> -for queries to pass to this database. Line 35 specifies the directory
> +E: 30.    # MDB definition for example.com
> +E: 31.    dn: olcDatabase=mdb,cn=config
> +E: 32.    objectClass: olcDatabaseConfig
> +E: 33.    objectClass: olcMdbConfig
> +E: 34.    olcDatabase: mdb
> +E: 35.    olcSuffix: dc=example,dc=com
> +E: 36.    olcDbDirectory: /usr/local/var/openldap-data
> +E: 37.    olcRootDN: cn=Manager,dc=example,dc=com
> +E: 38.    olcRootPW: secret
> +E: 39.    olcDbIndex: uid pres,eq
> +E: 40.    olcDbIndex: cn,sn pres,eq,approx,sub
> +E: 41.    olcDbIndex: objectClass eq
> +E: 42.    olcAccess: to attrs=userPassword
> +E: 43.      by self write
> +E: 44.      by anonymous auth
> +E: 45.      by dn.base="cn=Admin,dc=example,dc=com" write
> +E: 46.      by * none
> +E: 47.    olcAccess: to *
> +E: 48.      by self write
> +E: 49.      by dn.base="cn=Admin,dc=example,dc=com" write
> +E: 50.      by * read
> +E: 51.
> +
> +Line 30 is a comment. Lines 31-34 identify this entry as a MDB database
> +configuration entry.  Line 35 specifies the DN suffix
> +for queries to pass to this database. Line 36 specifies the directory
>  in which the database files will live.
>  
> -Lines 36 and 37 identify the database {{super-user}} entry and associated
> +Lines 37 and 38 identify the database {{super-user}} entry and associated
>  password. This entry is not subject to access control or size or
>  time limit restrictions.
>  
> -Lines 38 through 40 indicate the indices to maintain for various
> +Lines 39 through 41 indicate the indices to maintain for various
>  attributes.
>  
> -Lines 41 through 49 specify access control for entries in this
> +Lines 42 through 50 specify access control for entries in this
>  database. For all applicable entries, the {{EX:userPassword}} attribute is 
> writable
>  by the entry itself and by the "admin" entry.  It may be used for
>  authentication/authorization purposes, but is otherwise not readable.
>  All other attributes are writable by the entry and the "admin"
>  entry, but may be read by all users (authenticated or not).
>  
> -Line 50 is a blank line, indicating the end of this entry.
> +Line 51 is a blank line, indicating the end of this entry.
>  
>  The next entry defines another
>  MDB database. This one handles queries involving the
>  {{EX:dc=example,dc=net}} subtree but is managed by the same entity
> -as the first database.  Note that without line 60, the read access
> -would be allowed due to the global access rule at line 19.
> +as the first database.  Note that without line 61, the read access
> +would be allowed due to the global access rule at line 20.
>  
> -E: 51.    # MDB definition for example.net
> -E: 52.    dn: olcDatabase=mdb,cn=config
> -E: 53.    objectClass: olcDatabaseConfig
> -E: 54.    objectClass: olcMdbConfig
> -E: 55.    olcDatabase: mdb
> -E: 56.    olcSuffix: dc=example,dc=net
> -E: 57.    olcDbDirectory: /usr/local/var/openldap-data-net
> -E: 58.    olcRootDN: cn=Manager,dc=example,dc=com
> -E: 59.    olcDbIndex: objectClass eq
> -E: 60.    olcAccess: to * by users read
> +E: 52.    # MDB definition for example.net
> +E: 53.    dn: olcDatabase=mdb,cn=config
> +E: 54.    objectClass: olcDatabaseConfig
> +E: 55.    objectClass: olcMdbConfig
> +E: 56.    olcDatabase: mdb
> +E: 57.    olcSuffix: dc=example,dc=net
> +E: 58.    olcDbDirectory: /usr/local/var/openldap-data-net
> +E: 59.    olcRootDN: cn=Manager,dc=example,dc=com
> +E: 60.    olcDbIndex: objectClass eq
> +E: 61.    olcAccess: to * by users read
>  
>  
>  H2: Converting old style {{slapd.conf}}(5) file to {{cn=config}} format
> diff -Nru openldap-2.6.9+dfsg/doc/man/man5/ldap.conf.5 
> openldap-2.6.10+dfsg/doc/man/man5/ldap.conf.5
> --- openldap-2.6.9+dfsg/doc/man/man5/ldap.conf.5      2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/doc/man/man5/ldap.conf.5     2025-05-22 
> 10:56:21.000000000 -0700
> @@ -159,7 +159,6 @@
>  of the search.
>  .RE
>  .TP
> -.TP
>  .B HOST <name[:port] ...>
>  Specifies the name(s) of an LDAP server(s) to which the
>  .I LDAP 
> @@ -184,15 +183,18 @@
>  Linux only.
>  .TP
>  .B NETWORK_TIMEOUT <integer>
> -Specifies the timeout (in seconds) after which the poll(2)/select(2)
> -following a connect(2) returns in case of no activity.
> +Specifies the timeout (in seconds) after which the
> +.BR poll (2)/ select (2)
> +following a
> +.BR connect (2)
> +returns in case of no activity.
>  .TP
>  .B PORT <port>
>  Specifies the default port used when connecting to LDAP servers(s).
>  The port may be specified as a number.
>  .B PORT
>  is deprecated in favor of
> -.BR URI.
> +.BR URI .
>  .TP
>  .B REFERRALS <on/true/yes/off/false/no>
>  Specifies if the client should automatically follow referrals returned
> @@ -295,7 +297,7 @@
>  description).  The default is
>  .BR INT_MAX .
>  .TP
> -.B maxbufsize=<factor> 
> +.B maxbufsize=<factor>
>  specifies the maximum security layer receive buffer
>  size allowed.  0 disables security layers.  The default is 65536.
>  .RE
> @@ -338,7 +340,7 @@
>  be specified, separated by a semi-colon.  The
>  .B TLS_CACERT
>  is always used before
> -.B TLS_CACERTDIR.
> +.BR TLS_CACERTDIR .
>  .TP
>  .B TLS_CERT <filename>
>  Specifies the file that contains the client certificate.
> diff -Nru openldap-2.6.9+dfsg/doc/man/man5/slapd-config.5 
> openldap-2.6.10+dfsg/doc/man/man5/slapd-config.5
> --- openldap-2.6.9+dfsg/doc/man/man5/slapd-config.5   2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/doc/man/man5/slapd-config.5  2025-05-22 
> 10:56:21.000000000 -0700
> @@ -572,7 +572,7 @@
>  only go to stderr and are not recorded anywhere else.
>  Specifying a logfile copies messages to both stderr and the logfile.
>  .TP
> -.B olcLogFileFormat: debug | syslog-utc | syslog-localtime
> +.B olcLogFileFormat: debug|syslog-utc|syslog-localtime|rfc3339-utc
>  Specify the prefix format for messages written to the logfile. The debug
>  format is the normal format used for slapd debug messages, with a timestamp
>  in hexadecimal, followed by a thread ID.  The other options are to
> @@ -953,6 +953,13 @@
>  locations will be used. Multiple directories may be specified,
>  separated by a semi-colon.
>  .TP
> +.B olcTLSCACertificate: <CA cert>
> +Stores a single CA certificate that will be trusted by the server, in DER 
> format.
> +If this option is set, the \fBolcTLSCACertificateFile\fP and
> +\fBolcTLSCACertificatePath\fP options are ignored. If multiple
> +CA certificates are required, the \fBolcTLSCACertificateFile\fP
> +or \fBolcTLSCACertificatePath\fP options must be used instead of this option.
> +.TP
>  .B olcTLSCertificateFile: <filename>
>  Specifies the file that contains the
>  .B slapd
> @@ -961,17 +968,24 @@
>  When using OpenSSL that file may also contain any number of intermediate
>  certificates after the server certificate.
>  .TP
> +.B olcTLSCertificate: <cert>
> +Stores a single certificate for the server, in DER format. If this option is
> +used, the \fBolcTLSCertificateFile\fP option is ignored.
> +.TP
>  .B olcTLSCertificateKeyFile: <filename>
>  Specifies the file that contains the
>  .B slapd
> -server private key that matches the certificate stored in the
> -.B olcTLSCertificateFile
> -file. If the private key is protected with a password, the password must
> +server private key that matches the specified server certificate.
> +If the private key file is protected with a password, the password must
>  be manually typed in when slapd starts.  Usually the private key is not
>  protected with a password, to allow slapd to start without manual
>  intervention, so
>  it is of critical importance that the file is protected carefully. 
>  .TP
> +.B olcTLSCertificateKey <key>
> +Stores the private key that matches the server certificate. If this option is
> +used, the \fBolcTLSCertificateKeyFile\fP option is ignored.
> +.TP
>  .B olcTLSDHParamFile: <filename>
>  This directive specifies the file that contains parameters for Diffie-Hellman
>  ephemeral key exchange.  This is required in order to use a DSA certificate 
> on
> diff -Nru openldap-2.6.9+dfsg/doc/man/man5/slapd.conf.5 
> openldap-2.6.10+dfsg/doc/man/man5/slapd.conf.5
> --- openldap-2.6.9+dfsg/doc/man/man5/slapd.conf.5     2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/doc/man/man5/slapd.conf.5    2025-05-22 
> 10:56:21.000000000 -0700
> @@ -626,7 +626,7 @@
>  only go to stderr and are not recorded anywhere else.
>  Specifying a logfile copies messages to both stderr and the logfile.
>  .TP
> -.B logfile-format debug | syslog-utc | syslog-localtime
> +.B logfile-format debug|syslog-utc|syslog-localtime|rfc3339-utc
>  Specify the prefix format for messages written to the logfile. The debug
>  format is the normal format used for slapd debug messages, with a timestamp
>  in hexadecimal, followed by a thread ID.  The other options are to
> diff -Nru openldap-2.6.9+dfsg/doc/man/man5/slapo-dynlist.5 
> openldap-2.6.10+dfsg/doc/man/man5/slapo-dynlist.5
> --- openldap-2.6.9+dfsg/doc/man/man5/slapo-dynlist.5  2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/doc/man/man5/slapo-dynlist.5 2025-05-22 
> 10:56:21.000000000 -0700
> @@ -128,6 +128,9 @@
>  .B static-oc
>  objectClass is also specified, then the memberOf attribute will also be
>  populated with the DNs of the static groups that an entry is a member of.
> +Note that using the same
> +.B static-oc
> +objectClass in more than one dynamic group configuration is not supported.
>  If the optional
>  .B *
>  character is also specified, then the member and memberOf values will be
> diff -Nru openldap-2.6.9+dfsg/doc/man/man8/slapacl.8 
> openldap-2.6.10+dfsg/doc/man/man8/slapacl.8
> --- openldap-2.6.9+dfsg/doc/man/man8/slapacl.8        2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/doc/man/man8/slapacl.8       2025-05-22 
> 10:56:21.000000000 -0700
> @@ -131,15 +131,15 @@
>  for details.
>  .RE
>  .TP
> -.BI \-u
> -do not fetch the entry from the database.
> -In this case, if the entry does not exist, a fake entry with the
> +.B \-u
> +enable dry-run mode. Do not fetch any entries from the database.
> +In this case, a fake entry with the
>  .I DN
>  given with the
>  .B \-b
>  option is used, with no attributes.
>  As a consequence, those rules that depend on the contents 
> -of the target object will not behave as with the real object.
> +of the target object or any other database objects will not behave as with 
> the real object.
>  The
>  .I DN
>  given with the
> diff -Nru openldap-2.6.9+dfsg/libraries/libldap/error.c 
> openldap-2.6.10+dfsg/libraries/libldap/error.c
> --- openldap-2.6.9+dfsg/libraries/libldap/error.c     2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/libraries/libldap/error.c    2025-05-22 
> 10:56:21.000000000 -0700
> @@ -261,6 +261,25 @@
>       LDAP_MUTEX_LOCK( &ld->ld_res_mutex );
>       /* Find the result, last msg in chain... */
>       lm = r->lm_chain_tail;
> +     if ( r->lm_msgid != lm->lm_msgid ) {
> +             /*
> +              * ITS#10229: Returned with LDAP_MSG_ALL+LDAP_MSG_RECEIVED. 
> People who
> +              * do that aren't expected to call ldap_parse_result not least 
> because
> +              * they have no idea what the msgid of the result would be. 
> Just do our
> +              * best.
> +              *
> +              * We could also return LDAP_NO_RESULTS_RETURNED if there isn't 
> a
> +              * result for r's operation.
> +              */
> +             lm = r;
> +             for ( lm = r; lm; lm = lm->lm_chain ) {
> +                     if ( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY &&
> +                                     lm->lm_msgtype != 
> LDAP_RES_SEARCH_REFERENCE &&
> +                                     lm->lm_msgtype != LDAP_RES_INTERMEDIATE 
> )
> +                             break;
> +             }
> +     }
> +
>       /* FIXME: either this is not possible (assert?)
>        * or it should be handled */
>       if ( lm != NULL ) {
> diff -Nru openldap-2.6.9+dfsg/libraries/libldap/result.c 
> openldap-2.6.10+dfsg/libraries/libldap/result.c
> --- openldap-2.6.9+dfsg/libraries/libldap/result.c    2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/libraries/libldap/result.c   2025-05-22 
> 10:56:21.000000000 -0700
> @@ -146,8 +146,32 @@
>               "ldap_chkResponseList ld %p msgid %d all %d\n",
>               (void *)ld, msgid, all );
>  
> +     lm = ld->ld_responses;
> +     if ( lm && msgid == LDAP_RES_ANY && all == LDAP_MSG_RECEIVED ) {
> +             /*
> +              * ITS#10229: asked to return all messages received so far,
> +              * draft-ietf-ldapext-ldap-c-api which defines 
> LDAP_MSG_RECEIVED lets
> +              * us mix different msgids in what we return
> +              *
> +              * We have two choices in *how* we return the messages:
> +              * - we link all chains together
> +              * - we keep the chains intact and use lm_next
> +              *
> +              * The former will make life harder for ldap_parse_result 
> finding a
> +              * result message, the latter affects routines that iterate over
> +              * messages. This take does the former.
> +              */
> +             ld->ld_responses = NULL;
> +             while ( lm->lm_next ) {
> +                     lm->lm_chain_tail->lm_chain = lm->lm_next;
> +                     lm->lm_chain_tail = lm->lm_next->lm_chain_tail;
> +                     lm->lm_next = lm->lm_next->lm_next;
> +             }
> +             return lm;
> +     }
> +
>       lastlm = &ld->ld_responses;
> -     for ( lm = ld->ld_responses; lm != NULL; lm = nextlm ) {
> +     for ( ; lm != NULL; lm = nextlm ) {
>               nextlm = lm->lm_next;
>               ++cnt;
>  
> @@ -387,6 +411,37 @@
>                       LDAP_MUTEX_UNLOCK( &ld->ld_conn_mutex );
>               }
>  
> +             if ( all == LDAP_MSG_RECEIVED ) {
> +                     /*
> +                      * ITS#10229: we looped over all ready connections 
> accumulating
> +                      * messages in ld_responses, check if we have something 
> to return
> +                      * right now.
> +                      */
> +                     LDAPMessage **lp, *lm = ld->ld_responses;
> +
> +                     if ( lm && msgid == LDAP_RES_ANY ) {
> +                             *result = lm;
> +
> +                             ld->ld_responses = NULL;
> +                             while ( lm->lm_next ) {
> +                                     lm->lm_chain_tail->lm_chain = 
> lm->lm_next;
> +                                     lm->lm_chain_tail = 
> lm->lm_next->lm_chain_tail;
> +                                     lm->lm_next = lm->lm_next->lm_next;
> +                             }
> +                             rc = lm->lm_msgtype;
> +                             break;
> +                     }
> +
> +                     for ( lp = &ld->ld_responses; lm; lp = &lm->lm_next, lm 
> = *lp ) {
> +                             if ( msgid == lm->lm_msgid ) break;
> +                     }
> +                     if ( lm ) {
> +                             *lp = lm->lm_next;
> +                             *result = lm;
> +                             rc = lm->lm_msgtype;
> +                     }
> +             }
> +
>               if ( rc == LDAP_MSG_X_KEEP_LOOKING && tvp != NULL ) {
>                       struct timeval  curr_time_tv = { 0 },
>                                       delta_time_tv = { 0 };
> @@ -1096,7 +1151,10 @@
>  
>       /* is this the one we're looking for? */
>       if ( msgid == LDAP_RES_ANY || id == msgid ) {
> -             if ( all == LDAP_MSG_ONE
> +             if ( msgid == LDAP_RES_ANY && all == LDAP_MSG_RECEIVED ) {
> +                     /* ITS#10229: We want to keep going so long as there's 
> anything to
> +                      * read. */
> +             } else if ( all == LDAP_MSG_ONE
>                       || ( newmsg->lm_msgtype != LDAP_RES_SEARCH_RESULT
>                               && newmsg->lm_msgtype != LDAP_RES_SEARCH_ENTRY
>                               && newmsg->lm_msgtype != LDAP_RES_INTERMEDIATE
> diff -Nru openldap-2.6.9+dfsg/libraries/librewrite/subst.c 
> openldap-2.6.10+dfsg/libraries/librewrite/subst.c
> --- openldap-2.6.9+dfsg/libraries/librewrite/subst.c  2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/libraries/librewrite/subst.c 2025-05-22 
> 10:56:21.000000000 -0700
> @@ -131,6 +131,7 @@
>                               map = rewrite_xmap_parse( info,
>                                               p + 3, (const char **)&begin );
>                               if ( map == NULL ) {
> +                                     nsub++; /* make sure subs[nsub] is 
> freed */
>                                       goto cleanup;
>                               }
>                               submatch[ nsub ].ls_map = map;
> @@ -146,6 +147,7 @@
>                       map = rewrite_map_parse( info, p + 2,
>                                       (const char **)&begin );
>                       if ( map == NULL ) {
> +                             nsub++; /* make sure subs[nsub] is freed */
>                               goto cleanup;
>                       }
>                       p = begin - 1;
> @@ -165,6 +167,7 @@
>                       continue;
>  
>               } else {
> +                     nsub++; /* make sure subs[nsub] is freed */
>                       goto cleanup;
>               }
>  
> @@ -176,10 +179,6 @@
>        */
>       tmps = (struct berval * )realloc( subs, sizeof( struct berval )*( nsub 
> + 1 ) );
>       if ( tmps == NULL ) {
> -             /*
> -              * XXX need to free the value subst stuff!
> -              */
> -             free( subs );
>               goto cleanup;
>       }
>       subs = tmps;
> @@ -200,6 +199,7 @@
>  
>       s = calloc( sizeof( struct rewrite_subst ), 1 );
>       if ( s == NULL ) {
> +             nsub++; /* make sure last elements are freed */
>               goto cleanup;
>       }
>  
> @@ -213,13 +213,13 @@
>  cleanup:;
>       if ( subs ) {
>               for ( l=0; l<nsub; l++ ) {
> -                     free( subs[nsub].bv_val );
> +                     free( subs[l].bv_val );
>               }
>               free( subs );
>       }
>       if ( submatch ) {
>               for ( l=0; l<nsub; l++ ) {
> -                     free( submatch[nsub].ls_map );
> +                     free( submatch[l].ls_map );
>               }
>               free( submatch );
>       }
> diff -Nru openldap-2.6.9+dfsg/servers/lloadd/config.c 
> openldap-2.6.10+dfsg/servers/lloadd/config.c
> --- openldap-2.6.9+dfsg/servers/lloadd/config.c       2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/lloadd/config.c      2025-05-22 
> 10:56:21.000000000 -0700
> @@ -3767,6 +3767,10 @@
>              }
>  #endif /* ! HAVE_TLS */
>              b->b_tls_conf = tlskey[i].mask;
> +            if ( b->b_tls != LLOAD_LDAPS ) {
> +                b->b_tls = b->b_tls_conf;
> +                flag = LLOAD_BACKEND_MOD_OTHER;
> +            }
>          } break;
>          case CFG_WEIGHT:
>              b->b_weight = c->value_uint;
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/back-ldif/ldif.c 
> openldap-2.6.10+dfsg/servers/slapd/back-ldif/ldif.c
> --- openldap-2.6.9+dfsg/servers/slapd/back-ldif/ldif.c        2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/back-ldif/ldif.c       2025-05-22 
> 10:56:21.000000000 -0700
> @@ -1576,28 +1576,6 @@
>               goto done;
>       }
>  
> -     rc = ndn2path( op, &op->o_req_ndn, &path, 0 );
> -     if ( rc != LDAP_SUCCESS ) {
> -             goto done;
> -     }
> -
> -     ldif2dir_len( path );
> -     ldif2dir_name( path );
> -     if ( rmdir( path.bv_val ) < 0 ) {
> -             switch ( errno ) {
> -             case ENOTEMPTY:
> -                     rc = LDAP_NOT_ALLOWED_ON_NONLEAF;
> -                     break;
> -             case ENOENT:
> -                     /* is leaf, go on */
> -                     break;
> -             default:
> -                     rc = LDAP_OTHER;
> -                     rs->sr_text = "internal error (cannot delete subtree 
> directory)";
> -                     break;
> -             }
> -     }
> -
>       /* pre-read */
>       if ( op->o_preread ) {
>               Entry *e = NULL;
> @@ -1620,6 +1598,29 @@
>                       }
>               }
>               entry_free( e );
> +     } else {
> +             rc = ndn2path( op, &op->o_req_ndn, &path, 0 );
> +     }
> +
> +     if ( rc != LDAP_SUCCESS ) {
> +             goto done;
> +     }
> +
> +     ldif2dir_len( path );
> +     ldif2dir_name( path );
> +     if ( rmdir( path.bv_val ) < 0 ) {
> +             switch ( errno ) {
> +             case ENOTEMPTY:
> +                     rc = LDAP_NOT_ALLOWED_ON_NONLEAF;
> +                     break;
> +             case ENOENT:
> +                     /* is leaf, go on */
> +                     break;
> +             default:
> +                     rc = LDAP_OTHER;
> +                     rs->sr_text = "internal error (cannot delete subtree 
> directory)";
> +                     break;
> +             }
>       }
>  
>       if ( rc == LDAP_SUCCESS ) {
> @@ -1742,12 +1743,39 @@
>       char textbuf[SLAP_TEXT_BUFLEN];
>       int rc, same_ndn;
>  
> +     LDAPControl **preread_ctrl = NULL;
> +     LDAPControl **postread_ctrl = NULL;
> +     LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS];
> +     int num_ctrls = 0;
> +
> +     ctrls[num_ctrls] = NULL;
> +
>       slap_mods_opattrs( op, &op->orr_modlist, 1 );
>  
>       ldap_pvt_thread_mutex_lock( &li->li_modop_mutex );
>  
>       rc = get_entry( op, &entry, &old_path, &rs->sr_text );
>       if ( rc == LDAP_SUCCESS ) {
> +             if ( op->o_preread ) {
> +                     if ( preread_ctrl == NULL ) {
> +                             preread_ctrl = &ctrls[num_ctrls++];
> +                             ctrls[num_ctrls] = NULL;
> +                     }
> +                     if ( slap_read_controls( op, rs, entry,
> +                             &slap_pre_read_bv, preread_ctrl ) )
> +                     {
> +                             Debug( LDAP_DEBUG_ANY, "ldif_back_modify: "
> +                                     "pre-read failed \"%s\"\n",
> +                                     entry->e_name.bv_val );
> +                             if ( op->o_preread & SLAP_CONTROL_CRITICAL ) {
> +                                     /* FIXME: is it correct to abort
> +                                      * operation if control fails? */
> +                                     rc = rs->sr_err;
> +                                     goto done;
> +                             }
> +                     }
> +             }
> +
>               same_ndn = !ber_bvcmp( &entry->e_nname, &op->orr_nnewDN );
>               ber_bvreplace( &entry->e_name, &op->orr_newDN );
>               ber_bvreplace( &entry->e_nname, &op->orr_nnewDN );
> @@ -1758,11 +1786,32 @@
>                       rc = ldif_move_entry( op, entry, same_ndn, &old_path,
>                               &rs->sr_text );
>  
> +             if ( rc == LDAP_SUCCESS && op->o_postread ) {
> +                     if ( postread_ctrl == NULL ) {
> +                             postread_ctrl = &ctrls[num_ctrls++];
> +                             ctrls[num_ctrls] = NULL;
> +                     }
> +                     if ( slap_read_controls( op, rs, entry,
> +                             &slap_post_read_bv, postread_ctrl ) )
> +                     {
> +                             Debug( LDAP_DEBUG_ANY, "ldif_back_modify: "
> +                                     "post-read failed \"%s\"\n",
> +                                     entry->e_name.bv_val );
> +                             if ( op->o_postread & SLAP_CONTROL_CRITICAL ) {
> +                                     /* FIXME: is it correct to abort
> +                                      * operation if control fails? */
> +                                     rc = rs->sr_err;
> +                             }
> +                     }
> +             }
> +
>               entry_free( entry );
>               SLAP_FREE( old_path.bv_val );
>       }
>  
> +done:
>       ldap_pvt_thread_mutex_unlock( &li->li_modop_mutex );
> +     if ( num_ctrls ) rs->sr_ctrls = ctrls;
>       rs->sr_err = rc;
>       send_ldap_result( op, rs );
>       slap_graduate_commit_csn( op );
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/back-mdb/attr.c 
> openldap-2.6.10+dfsg/servers/slapd/back-mdb/attr.c
> --- openldap-2.6.9+dfsg/servers/slapd/back-mdb/attr.c 2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/back-mdb/attr.c        2025-05-22 
> 10:56:21.000000000 -0700
> @@ -98,6 +98,9 @@
>       int i, flags;
>       int rc;
>  
> +     if ( !mdb->mi_nattrs )
> +             return 0;
> +
>       txn = tx0;
>       if ( txn == NULL ) {
>               rc = mdb_txn_begin( mdb->mi_dbenv, NULL, 0, &txn );
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/back-mdb/config.c 
> openldap-2.6.10+dfsg/servers/slapd/back-mdb/config.c
> --- openldap-2.6.9+dfsg/servers/slapd/back-mdb/config.c       2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/back-mdb/config.c      2025-05-22 
> 10:56:21.000000000 -0700
> @@ -371,6 +371,9 @@
>       int i, rc, changed = 0;
>       unsigned short s;
>  
> +     if ( !mdb->mi_nattrs )
> +             return 0;
> +
>       rc = mdb_txn_begin( mdb->mi_dbenv, NULL, 0, &txn );
>       if ( rc )
>               return rc;
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/back-mdb/delete.c 
> openldap-2.6.10+dfsg/servers/slapd/back-mdb/delete.c
> --- openldap-2.6.9+dfsg/servers/slapd/back-mdb/delete.c       2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/back-mdb/delete.c      2025-05-22 
> 10:56:21.000000000 -0700
> @@ -148,17 +148,18 @@
>                       "<=- " 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;
> +             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 );
> +                     }
> +                     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;
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/back-mdb/tools.c 
> openldap-2.6.10+dfsg/servers/slapd/back-mdb/tools.c
> --- openldap-2.6.9+dfsg/servers/slapd/back-mdb/tools.c        2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/back-mdb/tools.c       2025-05-22 
> 10:56:21.000000000 -0700
> @@ -1051,7 +1051,7 @@
>       op.o_tmpmfuncs = &ch_mfuncs;
>  
>       /* id2entry index */
> -     rc = mdb_id2entry_update( &op, mdb_tool_txn, NULL, e );
> +     rc = mdb_id2entry_update( &op, mdb_tool_txn, idcursor, e );
>       if( rc != 0 ) {
>               snprintf( text->bv_val, text->bv_len,
>                               "id2entry_update failed: err=%d", rc );
> @@ -1086,6 +1086,7 @@
>               e->e_id = NOID;
>       }
>       mdb_tool_txn = NULL;
> +     idcursor = NULL;
>  
>       return e->e_id;
>  }
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/bconfig.c 
> openldap-2.6.10+dfsg/servers/slapd/bconfig.c
> --- openldap-2.6.9+dfsg/servers/slapd/bconfig.c       2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/bconfig.c      2025-05-22 
> 10:56:21.000000000 -0700
> @@ -1112,6 +1112,26 @@
>       return LDAP_SUCCESS;
>  }
>  
> +static int
> +config_copy_controls( Operation *op, SlapReply *rs )
> +{
> +     /* Accumulate response controls so we can return them to client */
> +     if ( rs->sr_ctrls ) {
> +             LDAPControl **prepared = op->o_callback->sc_private,
> +                                     **received = rs->sr_ctrls;
> +             slap_mask_t oldflags = rs->sr_flags;
> +
> +             rs->sr_ctrls = prepared;
> +             rs->sr_flags |= REP_CTRLS_MUSTBEFREED;
> +             slap_add_ctrls( op, rs, received );
> +             op->o_callback->sc_private = rs->sr_ctrls;
> +
> +             rs->sr_ctrls = received;
> +             rs->sr_flags = oldflags;
> +     }
> +     return 0;
> +}
> +
>  #define      GOT_CONFIG      1
>  #define      GOT_FRONTEND    2
>  static int
> @@ -2952,13 +2972,16 @@
>               }
>  
>               if ( c->argc == 2 ) {
> -                     if ( strcasecmp( c->argv[1], "advertise" ) == 0 ) {
> +                     if ( strcasecmp( c->argv[1], "FALSE" ) == 0 ) {
> +                             rc = 0;
> +                             break;
> +                     } else if ( strcasecmp( c->argv[1], "advertise" ) == 0 
> ) {
>                               advertise = 1;
>  
>                       } else if ( strcasecmp( c->argv[1], "TRUE" ) != 0 ) {
>                               /* log error */
>                               snprintf( c->cr_msg, sizeof( c->cr_msg),
> -                                     "subordinate must be \"TRUE\" or 
> \"advertise\"" );
> +                                     "subordinate must be \"TRUE\", 
> \"FALSE\" or \"advertise\"" );
>                               Debug( LDAP_DEBUG_ANY,
>                                       "%s: suffix \"%s\": %s.\n",
>                                       c->log, c->be->be_suffix[0].bv_val, 
> c->cr_msg );
> @@ -4821,7 +4844,7 @@
>       if ( use_ldif ) {
>               CfBackInfo *cfb = (CfBackInfo *)op->o_bd->be_private;
>               BackendDB *be = op->o_bd;
> -             slap_callback sc = { NULL, slap_null_cb, NULL, NULL }, *scp;
> +             slap_callback sc = { NULL, config_copy_controls, NULL, 
> rs->sr_ctrls }, *scp;
>               struct berval dn, ndn, xdn, xndn;
>  
>               op->o_bd = &cfb->cb_db;
> @@ -4838,6 +4861,8 @@
>  
>               scp = op->o_callback;
>               op->o_callback = &sc;
> +             rs->sr_ctrls = NULL;
> +
>               op->orr_newrdn = *newrdn;
>               op->orr_nnewrdn = *nnewrdn;
>               op->orr_newSup = NULL;
> @@ -4857,6 +4882,9 @@
>               op->o_ndn = ndn;
>               op->o_req_dn = xdn;
>               op->o_req_ndn = xndn;
> +
> +             rs->sr_ctrls = sc.sc_private;
> +             rs->sr_flags |= REP_CTRLS_MUSTBEFREED;
>       }
>       free( odn.bv_val );
>       free( ondn.bv_val );
> @@ -5648,6 +5676,7 @@
>       CfEntryInfo *ce2, *ce3, *cetmp = NULL, *cerem = NULL;
>       ConfigType etype = ce->ce_type;
>       int count = 0, rc = 0;
> +     char preread = op->o_preread, postread = op->o_postread;
>  
>       /* Reverse ce list */
>       for (ce2 = ce->ce_sibs;ce2;ce2 = ce3) {
> @@ -5665,6 +5694,9 @@
>               }
>       }
>  
> +     /* Suppress control generation for internal ops */
> +     op->o_postread = SLAP_CONTROL_NONE;
> +
>       /* Move original to a temp name until increments are done */
>       if ( rebase ) {
>               ce->ce_entry->e_private = NULL;
> @@ -5672,6 +5704,8 @@
>                       base+BIGTMP, 0, use_ldif );
>               ce->ce_entry->e_private = ce;
>       }
> +     op->o_preread = SLAP_CONTROL_NONE;
> +
>       /* start incrementing */
>       for (ce2=cetmp; ce2; ce2=ce3) {
>               ce3 = ce2->ce_sibs;
> @@ -5682,9 +5716,12 @@
>                               count+base, 0, use_ldif );
>               count--;
>       }
> +
> +     op->o_postread = postread;
>       if ( rebase )
>               rc = config_renumber_one( op, rs, ce->ce_parent, ce->ce_entry,
>                       base, 0, use_ldif );
> +     op->o_preread = preread;
>       return rc;
>  }
>  
> @@ -5692,7 +5729,11 @@
>  config_rename_del( Operation *op, SlapReply *rs, CfEntryInfo *ce,
>       CfEntryInfo *ce2, int old, int use_ldif )
>  {
> -     int count = 0;
> +     int rc, count = 0;
> +     char preread = op->o_preread, postread = op->o_postread;
> +
> +     /* Suppress control generation for internal ops */
> +     op->o_postread = SLAP_CONTROL_NONE;
>  
>       /* Renumber original to a temp value */
>       ce->ce_entry->e_private = NULL;
> @@ -5700,14 +5741,20 @@
>               old+BIGTMP, 0, use_ldif );
>       ce->ce_entry->e_private = ce;
>  
> +     op->o_preread = SLAP_CONTROL_NONE;
> +
>       /* start decrementing */
>       for (; ce2 != ce; ce2=ce2->ce_sibs) {
>               config_renumber_one( op, rs, ce2->ce_parent, ce2->ce_entry,
>                       count+old, 0, use_ldif );
>               count++;
>       }
> -     return config_renumber_one( op, rs, ce->ce_parent, ce->ce_entry,
> +
> +     op->o_postread = postread;
> +     rc = config_renumber_one( op, rs, ce->ce_parent, ce->ce_entry,
>               count+old, 0, use_ldif );
> +     op->o_preread = preread;
> +     return rc;
>  }
>  
>  /* Parse an LDAP entry into config directives, then store in underlying
> @@ -5723,7 +5770,9 @@
>       LDAPControl **postread_ctrl = NULL;
>       LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS];
>       int num_ctrls = 0;
> +     char postread = op->o_postread;
>  
> +     op->o_postread = SLAP_CONTROL_NONE;
>       ctrls[num_ctrls] = NULL;
>  
>       if ( !access_allowed( op, op->ora_e, slap_schema.si_ad_entry,
> @@ -5805,7 +5854,7 @@
>  
>       if ( cfb->cb_use_ldif ) {
>               BackendDB *be = op->o_bd;
> -             slap_callback sc = { NULL, slap_null_cb, NULL, NULL }, *scp;
> +             slap_callback sc = { NULL, config_copy_controls, NULL, 
> rs->sr_ctrls }, *scp;
>               struct berval dn, ndn;
>  
>               op->o_bd = &cfb->cb_db;
> @@ -5818,12 +5867,18 @@
>  
>               scp = op->o_callback;
>               op->o_callback = &sc;
> +             op->o_postread = postread;
> +             rs->sr_ctrls = NULL;
> +
>               op->o_bd->be_add( op, rs );
>               op->o_bd = be;
>               op->o_callback = scp;
>               op->o_dn = dn;
>               op->o_ndn = ndn;
> -     } else if ( op->o_postread ) {
> +
> +             rs->sr_ctrls = sc.sc_private;
> +             rs->sr_flags |= REP_CTRLS_MUSTBEFREED;
> +     } else if ( postread ) {
>               if ( postread_ctrl == NULL ) {
>                       postread_ctrl = &ctrls[num_ctrls++];
>                       ctrls[num_ctrls] = NULL;
> @@ -6277,7 +6332,7 @@
>  config_back_modify( Operation *op, SlapReply *rs )
>  {
>       CfBackInfo *cfb;
> -     CfEntryInfo *ce, *last;
> +     CfEntryInfo *ce, *last = NULL;
>       Modifications *ml;
>       ConfigArgs ca = {0};
>       struct berval rdn;
> @@ -6389,7 +6444,7 @@
>               rs->sr_text = ca.cr_msg;
>       } else if ( cfb->cb_use_ldif ) {
>               BackendDB *be = op->o_bd;
> -             slap_callback sc = { NULL, slap_null_cb, NULL, NULL }, *scp;
> +             slap_callback sc = { NULL, config_copy_controls, NULL, 
> rs->sr_ctrls }, *scp;
>               struct berval dn, ndn;
>  
>               op->o_bd = &cfb->cb_db;
> @@ -6401,11 +6456,16 @@
>  
>               scp = op->o_callback;
>               op->o_callback = &sc;
> +             rs->sr_ctrls = NULL;
> +
>               op->o_bd->be_modify( op, rs );
>               op->o_bd = be;
>               op->o_callback = scp;
>               op->o_dn = dn;
>               op->o_ndn = ndn;
> +
> +             rs->sr_ctrls = sc.sc_private;
> +             rs->sr_flags |= REP_CTRLS_MUSTBEFREED;
>       } else if ( op->o_postread ) {
>               if ( postread_ctrl == NULL ) {
>                       postread_ctrl = &ctrls[num_ctrls++];
> @@ -6435,7 +6495,7 @@
>  config_back_modrdn( Operation *op, SlapReply *rs )
>  {
>       CfBackInfo *cfb;
> -     CfEntryInfo *ce, *last;
> +     CfEntryInfo *ce, *last = NULL;
>       struct berval rdn;
>       int ixold, ixnew, dopause = 1;
>  
> @@ -6443,8 +6503,10 @@
>       LDAPControl **postread_ctrl = NULL;
>       LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS];
>       int num_ctrls = 0;
> +     char preread = op->o_preread, postread = op->o_postread;
>  
>       ctrls[num_ctrls] = NULL;
> +     op->o_preread = op->o_postread = SLAP_CONTROL_NONE;
>  
>       cfb = (CfBackInfo *)op->o_bd->be_private;
>  
> @@ -6563,7 +6625,7 @@
>       }
>  
>       /* If we have a backend, it will handle the control */
> -     if ( !cfb->cb_use_ldif && op->o_preread ) {
> +     if ( !cfb->cb_use_ldif && preread > SLAP_CONTROL_IGNORED ) {
>               if ( preread_ctrl == NULL ) {
>                       preread_ctrl = &ctrls[num_ctrls++];
>                       ctrls[num_ctrls] = NULL;
> @@ -6606,6 +6668,8 @@
>               Attribute *a;
>               rs->sr_err = config_rename_attr( rs, ce->ce_entry, &rdn, &a );
>               if ( rs->sr_err == LDAP_SUCCESS ) {
> +                     op->o_preread = preread;
> +                     op->o_postread = postread;
>                       rs->sr_err = config_rename_one( op, rs, ce->ce_entry,
>                               ce->ce_parent, a, &op->orr_newrdn, 
> &op->orr_nnewrdn,
>                               cfb->cb_use_ldif );
> @@ -6653,7 +6717,9 @@
>                       backend_db_move( ce->ce_be, ixnew );
>               else if ( ce->ce_type == Cft_Overlay )
>                       overlay_move( ce->ce_be, (slap_overinst *)ce->ce_bi, 
> ixnew );
> -                     
> +
> +             op->o_preread = preread;
> +             op->o_postread = postread;
>               if ( ixold < ixnew ) {
>                       rs->sr_err = config_rename_del( op, rs, ce, ceold, 
> ixold,
>                               cfb->cb_use_ldif );
> @@ -6664,7 +6730,8 @@
>               op->oq_modrdn = modr;
>       }
>  
> -     if ( rs->sr_err == LDAP_SUCCESS && !cfb->cb_use_ldif && op->o_postread 
> ) {
> +     if ( rs->sr_err == LDAP_SUCCESS && !cfb->cb_use_ldif &&
> +                     postread > SLAP_CONTROL_IGNORED ) {
>               if ( postread_ctrl == NULL ) {
>                       postread_ctrl = &ctrls[num_ctrls++];
>                       ctrls[num_ctrls] = NULL;
> @@ -6694,20 +6761,23 @@
>  {
>  #ifdef SLAP_CONFIG_DELETE
>       CfBackInfo *cfb;
> -     CfEntryInfo *ce, *last, *ce2;
> +     CfEntryInfo *ce, *ce2, *last = NULL;
>       int dopause = 1;
>  
>       LDAPControl **preread_ctrl = NULL;
>       LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS];
>       int num_ctrls = 0;
>  
> +     char preread = op->o_preread;
> +
>       ctrls[num_ctrls] = NULL;
> +     op->o_preread = SLAP_CONTROL_NONE;
>  
>       cfb = (CfBackInfo *)op->o_bd->be_private;
>  
>       /* If we have a backend, it will handle the control */
>       ce = config_find_base( cfb->cb_root, &op->o_req_ndn, &last, op );
> -     if ( ce && !cfb->cb_use_ldif && op->o_preread ) {
> +     if ( ce && !cfb->cb_use_ldif && preread ) {
>               if ( preread_ctrl == NULL ) {
>                       preread_ctrl = &ctrls[num_ctrls++];
>                       ctrls[num_ctrls] = NULL;
> @@ -6718,7 +6788,7 @@
>                       Debug( LDAP_DEBUG_ANY, "config_back_delete: "
>                                       "pre-read failed \"%s\"\n",
>                                       ce->ce_entry->e_name.bv_val );
> -                     if ( op->o_preread & SLAP_CONTROL_CRITICAL ) {
> +                     if ( preread & SLAP_CONTROL_CRITICAL ) {
>                               /* FIXME: is it correct to abort
>                                * operation if control fails? */
>                               goto out;
> @@ -6816,7 +6886,7 @@
>               /* remove from underlying database */
>               if ( cfb->cb_use_ldif ) {
>                       BackendDB *be = op->o_bd;
> -                     slap_callback sc = { NULL, slap_null_cb, NULL, NULL }, 
> *scp;
> +                     slap_callback sc = { NULL, config_copy_controls, NULL, 
> rs->sr_ctrls }, *scp;
>                       struct berval dn, ndn, req_dn, req_ndn;
>  
>                       op->o_bd = &cfb->cb_db;
> @@ -6833,6 +6903,9 @@
>  
>                       scp = op->o_callback;
>                       op->o_callback = &sc;
> +                     op->o_preread = preread;
> +                     rs->sr_ctrls = NULL;
> +
>                       op->o_bd->be_delete( op, rs );
>                       op->o_bd = be;
>                       op->o_callback = scp;
> @@ -6840,7 +6913,11 @@
>                       op->o_ndn = ndn;
>                       op->o_req_dn = req_dn;
>                       op->o_req_ndn = req_ndn;
> +
> +                     rs->sr_ctrls = sc.sc_private;
> +                     rs->sr_flags |= REP_CTRLS_MUSTBEFREED;
>               }
> +             op->o_preread = SLAP_CONTROL_NONE;
>  
>               /* renumber siblings */
>               iptr = ber_bvchr( &op->o_req_ndn, '{' ) + 1;
> @@ -6873,12 +6950,19 @@
>  config_back_search( Operation *op, SlapReply *rs )
>  {
>       CfBackInfo *cfb;
> -     CfEntryInfo *ce, *last;
> +     CfEntryInfo *ce, *last = NULL;
>       slap_mask_t mask;
> +     int paused = 0;
>  
>       cfb = (CfBackInfo *)op->o_bd->be_private;
>  
> -     ldap_pvt_thread_rdwr_rlock( &cfb->cb_rwlock );
> +     if ( ldap_pvt_thread_pool_query( &connection_pool,
> +                     LDAP_PVT_THREAD_POOL_PARAM_PAUSED, &paused ) ) {
> +             return -1;
> +     }
> +     if ( !paused ) {
> +             ldap_pvt_thread_rdwr_rlock( &cfb->cb_rwlock );
> +     }
>       ce = config_find_base( cfb->cb_root, &op->o_req_ndn, &last, op );
>       if ( !ce ) {
>               if ( last )
> @@ -6913,7 +6997,8 @@
>       }
>  
>  out:
> -     ldap_pvt_thread_rdwr_runlock( &cfb->cb_rwlock );
> +     if ( !paused )
> +             ldap_pvt_thread_rdwr_runlock( &cfb->cb_rwlock );
>       send_ldap_result( op, rs );
>       return rs->sr_err;
>  }
> @@ -6954,7 +7039,7 @@
>       Entry **ent )
>  {
>       CfBackInfo *cfb;
> -     CfEntryInfo *ce, *last;
> +     CfEntryInfo *ce, *last = NULL;
>       Entry *e = NULL;
>       int paused = 0, rc = LDAP_NO_SUCH_OBJECT;
>  
> @@ -7266,7 +7351,7 @@
>  {
>       struct berval schema_dn = BER_BVC(SCHEMA_RDN "," CONFIG_RDN);
>       ConfigArgs c = {0};
> -     CfEntryInfo *ce, *last;
> +     CfEntryInfo *ce, *last = NULL;
>       Entry *e;
>  
>       /* If there's no root entry, we must be in the midst of converting */
> @@ -7974,7 +8059,7 @@
>  {
>       CfBackInfo *cfb = be->be_private;
>       BackendInfo *bi = cfb->cb_db.bd_info;
> -     CfEntryInfo *ce, *last;
> +     CfEntryInfo *ce, *last = NULL;
>  
>       ce = config_find_base( cfb->cb_root, &e->e_nname, &last, NULL );
>  
> @@ -7989,7 +8074,7 @@
>  {
>       CfBackInfo *cfb = be->be_private;
>       BackendInfo *bi = cfb->cb_db.bd_info;
> -     CfEntryInfo *ce, *last;
> +     CfEntryInfo *ce, *last = NULL;
>  
>       ce = config_find_base( cfb->cb_root, ndn, &last, NULL );
>  
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/logging.c 
> openldap-2.6.10+dfsg/servers/slapd/logging.c
> --- openldap-2.6.9+dfsg/servers/slapd/logging.c       2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/logging.c      2025-05-22 
> 10:56:21.000000000 -0700
> @@ -46,14 +46,21 @@
>  static int splen;
>  static int logfile_rotfail, logfile_openfail;
>  
> -typedef enum { LFMT_DEFAULT, LFMT_DEBUG, LFMT_SYSLOG_UTC, LFMT_SYSLOG_LOCAL 
> } LogFormat;
> +typedef enum { LFMT_DEBUG, LFMT_SYSLOG, LFMT_RFC3339 } LogFormat;
>  static LogFormat logfile_format;
>  
> +#define LFMT_LOCALTIME 0x80
> +#define LFMT_DEFAULT LFMT_DEBUG
> +#define LFMT_SYSLOG_LOCAL    (LFMT_SYSLOG|LFMT_LOCALTIME)
> +#define LFMT_SYSLOG_UTC      (LFMT_SYSLOG)
> +#define LFMT_RFC3339_UTC     (LFMT_RFC3339)
> +
>  static slap_verbmasks logformat_key[] = {
>       { BER_BVC("default"),           LFMT_DEFAULT },
>       { BER_BVC("debug"),                     LFMT_DEBUG },
>       { BER_BVC("syslog-utc"),        LFMT_SYSLOG_UTC },
>       { BER_BVC("syslog-localtime"),          LFMT_SYSLOG_LOCAL },
> +     { BER_BVC("rfc3339-utc"),               LFMT_RFC3339_UTC },
>       { BER_BVNULL, 0 }
>  };
>  
> @@ -69,6 +76,13 @@
>  static int logpathlen;
>  
>  #define SYSLOG_STAMP "Mmm dd hh:mm:ss"
> +#ifdef HAVE_CLOCK_GETTIME
> +#define RFC3339_FRAC ".fffffffffZ"
> +#else
> +#define RFC3339_FRAC ".ffffffZ"
> +#endif
> +#define RFC3339_BASE "YYYY-mm-ddTHH:MM:SS"
> +#define RFC3339_STAMP         RFC3339_BASE RFC3339_FRAC
>  
>  void
>  slap_debug_print( const char *data )
> @@ -84,11 +98,13 @@
>  #ifdef HAVE_CLOCK_GETTIME
>       struct timespec tv;
>  #define      TS      "%08x"
> +#define      TSf     ".%09ldZ"
>  #define      Tfrac   tv.tv_nsec
>  #define gettime(tv)  clock_gettime( CLOCK_REALTIME, tv )
>  #else
>       struct timeval tv;
>  #define      TS      "%05x"
> +#define      TSf     ".%06ldZ"
>  #define      Tfrac   tv.tv_usec
>  #define      gettime(tv)     gettimeofday( tv, NULL )
>  #endif
> @@ -171,7 +187,7 @@
>  
>               if ( logfile_format > LFMT_DEBUG ) {
>                       struct tm tm;
> -                     if ( logfile_format == LFMT_SYSLOG_UTC )
> +                     if ( !( logfile_format & LFMT_LOCALTIME ) )
>                               ldap_pvt_gmtime( &tv.tv_sec, &tm );
>                       else
>                               ldap_pvt_localtime( &tv.tv_sec, &tm );
> @@ -182,9 +198,15 @@
>  #else
>                       ptr = syslog_prefix;
>  #endif
> -                     strftime( ptr, sizeof( SYSLOG_STAMP ),
> -                             "%b %d %H:%M:%S", &tm );
> -                     ptr[ sizeof( SYSLOG_STAMP )-1 ] = ' ';
> +                     if ( logfile_format & LFMT_SYSLOG ) {
> +                             ptr += strftime( ptr, sizeof( SYSLOG_STAMP ),
> +                                     "%b %d %H:%M:%S", &tm );
> +                     }       else {
> +                             ptr += strftime( ptr, sizeof( RFC3339_BASE ),
> +                                     "%Y-%m-%dT%H:%M:%S", &tm );
> +                             ptr += snprintf( ptr, sizeof( RFC3339_FRAC ), 
> TSf, Tfrac );
> +                     }
> +                     *ptr = ' ';
>  #ifdef _WIN32
>                       len = datalen + splen;
>  #else
> @@ -814,11 +836,12 @@
>                       }
>                       if ( syslog_prefix )
>                               ch_free( syslog_prefix );
> -                     len = strlen( global_host ) + 1 + strlen( serverName ) 
> + 1 + sizeof("[123456789]:") +
> -                             sizeof( SYSLOG_STAMP );
> -                     syslog_prefix = ch_malloc( len );
> -                     splen = sprintf( syslog_prefix, SYSLOG_STAMP " %s 
> %s[%d]: ", global_host, serverName, getpid() );
>                       logfile_format = logformat_key[i].mask;
> +                     len = strlen( global_host ) + 1 + strlen( serverName ) 
> + 1 + sizeof(("[123456789]:")) +
> +                             (( logfile_format & LFMT_RFC3339) ? sizeof( 
> RFC3339_STAMP ) : sizeof( SYSLOG_STAMP ));
> +                     syslog_prefix = ch_malloc( len );
> +                     splen = sprintf( syslog_prefix, "%s %s %s[%d]: ", ( 
> logfile_format & LFMT_RFC3339 ) ?
> +                             RFC3339_STAMP : SYSLOG_STAMP, global_host, 
> serverName, getpid() );
>                       }
>                       break;
>  
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/overlays/autoca.c 
> openldap-2.6.10+dfsg/servers/slapd/overlays/autoca.c
> --- openldap-2.6.9+dfsg/servers/slapd/overlays/autoca.c       2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/overlays/autoca.c      2025-05-22 
> 10:56:21.000000000 -0700
> @@ -670,6 +670,7 @@
>                               else
>                                       rc = 1;
>                       }
> +                     break;
>               case ACA_USRKEYBITS:
>                       if ( c->value_int < MIN_KEYBITS )
>                               rc = 1;
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/overlays/memberof.c 
> openldap-2.6.10+dfsg/servers/slapd/overlays/memberof.c
> --- openldap-2.6.9+dfsg/servers/slapd/overlays/memberof.c     2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/overlays/memberof.c    2025-05-22 
> 10:56:21.000000000 -0700
> @@ -1301,10 +1301,8 @@
>       if ( save_member ) {
>               op->o_dn = op->o_bd->be_rootdn;
>               op->o_ndn = op->o_bd->be_rootndn;
> -             op->o_bd->bd_info = (BackendInfo *)on->on_info;
>               rc = backend_attribute( op, NULL, &op->o_req_ndn,
>                               mo->mo_ad_member, &mci->member, ACL_READ );
> -             op->o_bd->bd_info = (BackendInfo *)on;
>       }
>  
>       sc->sc_next = op->o_callback;
> @@ -1503,10 +1501,8 @@
>  
>               case LDAP_MOD_REPLACE:
>                       /* delete all ... */
> -                     op->o_bd->bd_info = (BackendInfo *)on->on_info;
>                       rc = backend_attribute( op, NULL, &op->o_req_ndn,
>                                       mo->mo_ad_memberof, &vals, ACL_READ );
> -                     op->o_bd->bd_info = (BackendInfo *)on;
>                       if ( rc == LDAP_SUCCESS ) {
>                               for ( i = 0; !BER_BVISNULL( &vals[ i ] ); i++ ) 
> {
>                                       memberof_value_modify( op,
> @@ -1641,10 +1637,8 @@
>       }
>  
>       if ( mci->what & MEMBEROF_IS_GROUP ) {
> -             op->o_bd->bd_info = (BackendInfo *)on->on_info;
>               rc = backend_attribute( op, NULL, &op->orr_nnewDN,
>                               mo->mo_ad_member, &vals, ACL_READ );
> -             op->o_bd->bd_info = (BackendInfo *)on;
>  
>               if ( rc == LDAP_SUCCESS ) {
>                       for ( i = 0; !BER_BVISNULL( &vals[ i ] ); i++ ) {
> @@ -1658,10 +1652,8 @@
>       }
>  
>       if ( MEMBEROF_REFINT( mo ) && ( mci->what & MEMBEROF_IS_MEMBER ) ) {
> -             op->o_bd->bd_info = (BackendInfo *)on->on_info;
>               rc = backend_attribute( op, NULL, &op->orr_nnewDN,
>                               mo->mo_ad_memberof, &vals, ACL_READ );
> -             op->o_bd->bd_info = (BackendInfo *)on;
>  
>               if ( rc == LDAP_SUCCESS ) {
>                       for ( i = 0; !BER_BVISNULL( &vals[ i ] ); i++ ) {
> @@ -2159,6 +2151,15 @@
>  
>               case MO_ADDCHECK:
>                       if ( c->value_int ) {
> +                             if ( SLAP_ISGLOBALOVERLAY( c->be ) ) {
> +                                     snprintf( c->cr_msg, sizeof( c->cr_msg 
> ),
> +                                             "addcheck functionality not 
> supported "
> +                                             "when memberof is a global 
> overlay",
> +                                             c->argv[ 1 ] );
> +                                     Debug( LDAP_DEBUG_ANY, "%s: %s.\n",
> +                                             c->log, c->cr_msg );
> +                                     return 1;
> +                             }
>                               mo->mo_flags |= MEMBEROF_FADDCHECK;
>  
>                       } else {
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/overlays/pcache.c 
> openldap-2.6.10+dfsg/servers/slapd/overlays/pcache.c
> --- openldap-2.6.9+dfsg/servers/slapd/overlays/pcache.c       2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/overlays/pcache.c      2025-05-22 
> 10:56:21.000000000 -0700
> @@ -749,7 +749,7 @@
>               }
>       }
>  
> -     if ( got != GOT_ALL ) {
> +     if ( (got & GOT_ALL) != GOT_ALL) {
>               rc = 1;
>               goto error;
>       }
> @@ -802,7 +802,11 @@
>                       goto error;
>               }
>  
> -             cq = add_query( op, qm, &query, qt, PC_POSITIVE, 0 );
> +             if (BER_BVISNULL( &uuid )) {
> +               cq = add_query( op, qm, &query, qt, PC_NEGATIVE, 0 );
> +             } else {
> +               cq = add_query( op, qm, &query, qt, PC_POSITIVE, 0 );
> +             }
>               if ( cq != NULL ) {
>                       cq->expiry_time = expiry_time;
>                       cq->refresh_time = refresh_time;
> @@ -1580,6 +1584,8 @@
>  
>       case PC_NEGATIVE:
>               ttl = templ->negttl;
> +             if ( templ->ttr )
> +                     ttr = now + templ->ttr;
>               break;
>  
>       case PC_SIZELIMIT:
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/slapacl.c 
> openldap-2.6.10+dfsg/servers/slapd/slapacl.c
> --- openldap-2.6.9+dfsg/servers/slapd/slapacl.c       2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/slapacl.c      2025-05-22 
> 10:56:21.000000000 -0700
> @@ -60,6 +60,18 @@
>       return rc;
>  }
>  
> +static int
> +slapacl_entry_get(
> +     Operation *op,
> +     struct berval *dn,
> +     ObjectClass *oc,
> +     AttributeDescription *ad,
> +     int rw,
> +     Entry **e )
> +{
> +     return LDAP_UNWILLING_TO_PERFORM;
> +}
> +
>  int
>  slapacl( int argc, char **argv )
>  {
> @@ -293,6 +305,8 @@
>                               }
>                       }
>               }
> +     } else {
> +             op->o_bd->be_fetch = slapacl_entry_get;
>       }
>  
>       for ( ; argc--; argv++ ) {
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/slapcommon.c 
> openldap-2.6.10+dfsg/servers/slapd/slapcommon.c
> --- openldap-2.6.9+dfsg/servers/slapd/slapcommon.c    2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/slapcommon.c   2025-05-22 
> 10:56:21.000000000 -0700
> @@ -423,27 +423,42 @@
>                       rc = ldap_url_parse_ext( optarg, &ludp,
>                               LDAP_PVT_URL_PARSE_NOEMPTY_HOST | 
> LDAP_PVT_URL_PARSE_NOEMPTY_DN );
>                       if ( rc != LDAP_URL_SUCCESS ) {
> +                             fprintf( stderr, "Cannot parse '%s' as LDAP 
> URI.\n", optarg );
>                               usage( tool, progname );
>                       }
>  
>                       /* don't accept host, port, attrs, extensions */
>                       if ( ldap_pvt_url_scheme2proto( ludp->lud_scheme ) != 
> LDAP_PROTO_TCP ) {
> +                             fprintf( stderr, "%s URIs need to use ldap:// 
> scheme.\n",
> +                                             progname );
>                               usage( tool, progname );
>                       }
>  
>                       if ( ludp->lud_host != NULL ) {
> +                             fprintf( stderr, "%s URIs cannot carry a host. "
> +                                             "Only base, scope and filter 
> are accepted\n",
> +                                             progname );
>                               usage( tool, progname );
>                       }
>  
>                       if ( ludp->lud_port != 0 ) {
> +                             fprintf( stderr, "%s URIs cannot carry a port. "
> +                                             "Only base, scope and filter 
> are accepted\n",
> +                                             progname );
>                               usage( tool, progname );
>                       }
>  
>                       if ( ludp->lud_attrs != NULL ) {
> +                             fprintf( stderr, "%s URIs cannot carry an 
> attribute specification. "
> +                                             "Only base, scope and filter 
> are accepted\n",
> +                                             progname );
>                               usage( tool, progname );
>                       }
>  
>                       if ( ludp->lud_exts != NULL ) {
> +                             fprintf( stderr, "%s URIs cannot carry an 
> extension specification. "
> +                                             "Only base, scope and filter 
> are accepted\n",
> +                                             progname );
>                               usage( tool, progname );
>                       }
>  
> @@ -465,6 +480,7 @@
>  
>               case 'j':       /* jump to linenumber */
>                       if ( lutil_atoul( &jumpline, optarg ) ) {
> +                             fprintf( stderr, "Invalid line number '%s'\n", 
> optarg );
>                               usage( tool, progname );
>                       }
>                       break;
> @@ -479,6 +495,7 @@
>  
>               case 'N':
>                       if ( dn_mode && dn_mode != SLAP_TOOL_LDAPDN_NORMAL ) {
> +                             fputs( "Invalid combination of -N/-P 
> provided\n", stderr );
>                               usage( tool, progname );
>                       }
>                       dn_mode = SLAP_TOOL_LDAPDN_NORMAL;
> @@ -486,6 +503,7 @@
>  
>               case 'n':       /* which config file db to index */
>                       if ( lutil_atoi( &dbnum, optarg ) || dbnum < 0 ) {
> +                             fputs( "Invalid database index provided\n", 
> stderr );
>                               usage( tool, progname );
>                       }
>                       break;
> @@ -498,6 +516,7 @@
>  
>               case 'P':
>                       if ( dn_mode && dn_mode != SLAP_TOOL_LDAPDN_PRETTY ) {
> +                             fputs( "Invalid combination of -N/-P 
> provided\n", stderr );
>                               usage( tool, progname );
>                       }
>                       dn_mode = SLAP_TOOL_LDAPDN_PRETTY;
> @@ -520,6 +539,7 @@
>                       if ( lutil_atou( &csnsid, optarg )
>                               || csnsid > SLAP_SYNC_SID_MAX )
>                       {
> +                             fputs( "Invalid serverid provided\n", stderr );
>                               usage( tool, progname );
>                       }
>                       break;
> diff -Nru openldap-2.6.9+dfsg/servers/slapd/syncrepl.c 
> openldap-2.6.10+dfsg/servers/slapd/syncrepl.c
> --- openldap-2.6.9+dfsg/servers/slapd/syncrepl.c      2024-11-26 
> 09:11:04.000000000 -0800
> +++ openldap-2.6.10+dfsg/servers/slapd/syncrepl.c     2025-05-22 
> 10:56:21.000000000 -0700
> @@ -2793,7 +2793,6 @@
>  
>  typedef struct modify_ctxt {
>       Modifications *mx_orig;
> -     Modifications *mx_free;
>       Entry *mx_entry;
>  } modify_ctxt;
>  
> @@ -2805,11 +2804,8 @@
>       Modifications *ml;
>  
>       op->orm_no_opattrs = 0;
> +     slap_mods_free( op->orm_modlist, 0 );
>       op->orm_modlist = mx->mx_orig;
> -     for ( ml = mx->mx_free; ml; ml = mx->mx_free ) {
> -             mx->mx_free = ml->sml_next;
> -             op->o_tmpfree( ml, op->o_tmpmemctx );
> -     }
>       if ( mx->mx_entry ) {
>               entry_free( mx->mx_entry );
>       }
> @@ -2997,10 +2993,10 @@
>               sc->sc_next = op->o_callback;
>               sc->sc_cleanup = NULL;
>               sc->sc_writewait = NULL;
> -             op->o_callback = sc;
> +             overlay_callback_after_backover( op, sc, 1 );
> +
>               op->orm_no_opattrs = 1;
>               mx->mx_orig = op->orm_modlist;
> -             mx->mx_free = newlist;
>               mx->mx_entry = e_dup;
>               for ( ml = newlist; ml; ml=ml->sml_next ) {
>                       if ( ml->sml_flags == SLAP_MOD_INTERNAL ) {


-- 
Sebastian Ramacher

Reply via email to