diff --git a/.gitignore b/.gitignore index f7259b87c0..224c33fdad 100644 --- a/.gitignore +++ b/.gitignore @@ -75,6 +75,7 @@ servers/slapd/back-mdb/mdbx_copy servers/slapd/back-mdb/mdbx_dump servers/slapd/back-mdb/mdbx_load servers/slapd/back-mdb/mdbx_stat +servers/slapd/back-mdb/mdbx_drop servers/slapd/builtin.c servers/slapd/shell-backends/passwd-shell servers/slapd/slapacl diff --git a/bootstrap.sh b/bootstrap.sh index cdbcc667ac..6d7d0def3a 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -40,11 +40,11 @@ else fi if [ -z "$AUTORECONF" ]; then - if [ -n "$(which autoreconf)" ] && autoreconf --version | grep -q 'autoreconf (GNU Autoconf) 2\.69'; then + if [ -n "$(which autoreconf)" ] && autoreconf --version | grep -q 'autoreconf (GNU Autoconf) 2\.71'; then AUTORECONF=$(which autoreconf) - elif [ -n "$(which autoreconf-2.69)" ]; then + elif [ -n "$(which autoreconf-2.71)" ]; then AUTORECONF=$(which autoreconf-2.69) - elif [ -n "$(which autoreconf2.69)" ]; then + elif [ -n "$(which autoreconf2.71)" ]; then AUTORECONF=$(which autoreconf2.69) else echo "no suitable autoreconf available" >&2; exit 2 diff --git a/clients/tools/common.c b/clients/tools/common.c index b16b0d8522..61862abf85 100644 --- a/clients/tools/common.c +++ b/clients/tools/common.c @@ -774,7 +774,7 @@ void tool_args(int argc, char **argv) { if (retcode == -1 || (unsigned)retcode > bv.bv_len) { fprintf(stderr, "Unable to parse value of general control %s\n", - control); + cvalue); usage(); } diff --git a/clients/tools/ldapsearch.c b/clients/tools/ldapsearch.c index e401d4fe64..1eda45bcbf 100644 --- a/clients/tools/ldapsearch.c +++ b/clients/tools/ldapsearch.c @@ -801,7 +801,6 @@ int handle_private_option(int i) { if (freeval) { c[nctrls - 1].ldctl_value = value; - } else { ber_dupbv(&c[nctrls - 1].ldctl_value, &value); } @@ -827,10 +826,8 @@ int handle_private_option(int i) { case 'l': /* time limit */ if (strcasecmp(optarg, "none") == 0) { timelimit = 0; - } else if (strcasecmp(optarg, "max") == 0) { timelimit = LDAP_MAXINT; - } else { ival = strtol(optarg, &next, 10); if (next == NULL || next[0] != '\0') { @@ -882,10 +879,8 @@ int handle_private_option(int i) { case 'z': /* size limit */ if (strcasecmp(optarg, "none") == 0) { sizelimit = 0; - } else if (strcasecmp(optarg, "max") == 0) { sizelimit = LDAP_MAXINT; - } else { ival = strtol(optarg, &next, 10); if (next == NULL || next[0] != '\0') { diff --git a/configure.ac b/configure.ac index 6400433f4d..0dd7a090aa 100644 --- a/configure.ac +++ b/configure.ac @@ -34,14 +34,9 @@ A copy of this license is available in the file LICENSE in the top-level directory of the distribution or, alternatively, at .]]) -AC_PREREQ([2.69])dnl Required Autoconf version +AC_PREREQ([2.71])dnl Required Autoconf version AC_REVISION([$Id: 8c9139400f1cfd3f68bc9b65828515fe85e91ee1 $]) -AC_INIT( - [m4_esyscmd_s(build/BRANDING --package)], - [m4_esyscmd_s(build/BRANDING --version-full)], - [m4_esyscmd_s(build/BRANDING --bugs)], - [m4_esyscmd_s(build/BRANDING --tarname)], - [m4_esyscmd_s(build/BRANDING --url)]) +AC_INIT([m4_esyscmd_s(build/BRANDING --package)],[m4_esyscmd_s(build/BRANDING --version-full)],[m4_esyscmd_s(build/BRANDING --bugs)],[m4_esyscmd_s(build/BRANDING --tarname)],[m4_esyscmd_s(build/BRANDING --url)]) AC_CONFIG_MACRO_DIR([build/m4]) dnl ---------------------------------------------------------------- dnl OpenLDAP Autoconf Macros @@ -145,17 +140,15 @@ AC_ARG_VAR(EXTRA_CFLAGS, [Extra build-time CFLAGS, e.g. -Wall -Werror. AC_PREFIX_DEFAULT("/opt/reopenldap") dnl ---------------------------------------------------------------- -AC_PROG_CC([gcc clang icc cc]) +AC_PROG_CC([gcc clang cc]) if test "${ac_cv_prog_cc_stdc}" = no ; then AC_MSG_ERROR([ReOpenLDAP requires compiler to support STDC constructs.]) fi - -AC_PROG_CC_C99 if test "$ac_cv_prog_cc_c99" = no; then AC_MSG_ERROR([ReOpenLDAP requires compiler to support C99 constructs.]) fi -AC_PROG_CXX([g++ clang++ icpc c++]) +AC_PROG_CXX([g++ clang++ c++]) AC_PROG_CPP AC_PROG_INSTALL AC_PROG_LN_S @@ -2270,7 +2263,6 @@ AC_CHECK_TYPE([sig_atomic_t],, AC_TYPE_UID_T -AC_HEADER_TIME AC_STRUCT_TM AC_CHECK_MEMBERS([struct stat.st_blksize]) AC_CHECK_MEMBERS([struct passwd.pw_gecos],,,[$ac_includes_default diff --git a/include/ldap_log.h b/include/ldap_log.h index e18b6325cd..bc3e15cf5c 100644 --- a/include/ldap_log.h +++ b/include/ldap_log.h @@ -129,21 +129,38 @@ LDAP_SLAPD_V(int) slap_syslog_severity; do { \ if (ldap_debug_mask & (level)) \ ldap_debug_print(__VA_ARGS__); \ - if (slap_syslog_mask & (level)) \ + else if (slap_syslog_mask & (level)) \ syslog(LDAP_LEVEL_MASK((severity)), __VA_ARGS__); \ } while (0) +#define vLog(level, severity, fmt, ap) \ + do { \ + if (ldap_debug_mask & (level)) \ + ldap_debug_va(fmt, ap); \ + else if (slap_syslog_mask & (level)) \ + vsyslog(LDAP_LEVEL_MASK((severity)), fmt, ap); \ + } while (0) #elif !defined(LDAP_DEBUG) && (defined(LDAP_SYSLOG) && defined(SLAP_INSIDE)) #define Log(level, severity, ...) \ do { \ if (slap_syslog_mask & (level)) \ syslog(LDAP_LEVEL_MASK((severity)), __VA_ARGS__); \ } while (0) +#define vLog(level, severity, fmt, ap) \ + do { \ + if (slap_syslog_mask & (level)) \ + vsyslog(LDAP_LEVEL_MASK((severity)), fmt, ap); \ + } while (0) #else #define Log(level, severity, ...) \ do { \ if (ldap_debug_mask & (level)) \ ldap_debug_print(__VA_ARGS__); \ } while (0) +#define vLog(level, severity, fmt, ap) \ + do { \ + if (ldap_debug_mask & (level)) \ + ldap_debug_va(fmt, ap); \ + } while (0) #endif /* LDAP_DEBUG && LDAP_SYSLOG */ #define Debug(level, ...) Log((level), slap_syslog_severity, __VA_ARGS__) diff --git a/libraries/libreldap/memory.c b/libraries/libreldap/memory.c index bcad9bbba6..6abec26105 100644 --- a/libraries/libreldap/memory.c +++ b/libraries/libreldap/memory.c @@ -378,12 +378,12 @@ struct berval *ber_dupbv_x(struct berval *dst, const struct berval *src, dup->bv_len = src->bv_len; } - if (dst) { + if (dup != &tmp) + return dup; + else { *dst = *dup; - dup = dst; + return dst; } - - return dup; } struct berval *ber_dupbv(struct berval *dst, const struct berval *src) { diff --git a/servers/slapd/back-mdb/Makefile.am b/servers/slapd/back-mdb/Makefile.am index fdd99bd9b1..ea6697d867 100644 --- a/servers/slapd/back-mdb/Makefile.am +++ b/servers/slapd/back-mdb/Makefile.am @@ -15,7 +15,7 @@ pkglib_LTLIBRARIES = noinst_LTLIBRARIES = libmdbx.la -bin_PROGRAMS = mdbx_stat mdbx_copy mdbx_dump mdbx_load mdbx_chk +bin_PROGRAMS = mdbx_stat mdbx_copy mdbx_dump mdbx_load mdbx_chk mdbx_drop back_mdb_la_LDFLAGS = -module AM_CPPFLAGS = -DSLAPD_IMPORT -I$(srcdir)/.. -I$(top_srcdir)/include @@ -45,26 +45,21 @@ libmdbx_la_CFLAGS += -DNDEBUG=1 -DMDBX_DEBUG=0 $(AM_CFLAGS) endif libmdbx_la_LIBADD = $(LTHREAD_LIBS) libmdbx_srcdir = ../../../libraries/libmdbx -libmdbx_la_SOURCES = ../../../libraries/libmdbx/src/version.c \ - ../../../libraries/libmdbx/src/lck-posix.c \ - ../../../libraries/libmdbx/src/mdbx.c \ - ../../../libraries/libmdbx/src/osal.c +libmdbx_la_SOURCES = ../../../libraries/libmdbx/mdbx.c EXTRA_DIST = ../../../libraries/libmdbx/LICENSE \ - ../../../libraries/libmdbx/COPYRIGHT \ ../../../libraries/libmdbx/README.md \ ../../../libraries/libmdbx/mdbx.h \ - ../../../libraries/libmdbx/README-RU.md \ ../../../libraries/libmdbx/AUTHORS \ - ../../../libraries/libmdbx/src/bits.h \ - ../../../libraries/libmdbx/src/defs.h \ - ../../../libraries/libmdbx/src/osal.h \ ../../../libraries/libmdbx/.clang-format -dist_man_MANS = ../../../libraries/libmdbx/src/tools/mdbx_dump.1 \ - ../../../libraries/libmdbx/src/tools/mdbx_copy.1 \ - ../../../libraries/libmdbx/src/tools/mdbx_stat.1 \ - ../../../libraries/libmdbx/src/tools/mdbx_load.1 +dist_man_MANS = \ + ../../../libraries/libmdbx/man1/mdbx_chk.1 \ + ../../../libraries/libmdbx/man1/mdbx_copy.1 \ + ../../../libraries/libmdbx/man1/mdbx_drop.1 \ + ../../../libraries/libmdbx/man1/mdbx_dump.1 \ + ../../../libraries/libmdbx/man1/mdbx_load.1 \ + ../../../libraries/libmdbx/man1/mdbx_stat.1 back_mdb_la_SOURCES = add.c attr.c banner.c bind.c compare.c \ config.c delete.c dn2entry.c dn2id.c extended.c filterindex.c \ @@ -75,14 +70,16 @@ back_mdb_la_SOURCES = add.c attr.c banner.c bind.c compare.c \ back_mdb_la_CFLAGS = -I$(srcdir)/.. -I$(top_srcdir)/libraries/libmdbx $(AM_CFLAGS) back_mdb_la_LIBADD = libmdbx.la -mdbx_chk_SOURCES = ../../../libraries/libmdbx/src/tools/mdbx_chk.c -mdbx_copy_SOURCES = ../../../libraries/libmdbx/src/tools/mdbx_copy.c -mdbx_dump_SOURCES = ../../../libraries/libmdbx/src/tools/mdbx_dump.c -mdbx_load_SOURCES = ../../../libraries/libmdbx/src/tools/mdbx_load.c -mdbx_stat_SOURCES = ../../../libraries/libmdbx/src/tools/mdbx_stat.c +mdbx_chk_SOURCES = ../../../libraries/libmdbx/mdbx_chk.c +mdbx_copy_SOURCES = ../../../libraries/libmdbx/mdbx_copy.c +mdbx_dump_SOURCES = ../../../libraries/libmdbx/mdbx_dump.c +mdbx_load_SOURCES = ../../../libraries/libmdbx/mdbx_load.c +mdbx_stat_SOURCES = ../../../libraries/libmdbx/mdbx_stat.c +mdbx_drop_SOURCES = ../../../libraries/libmdbx/mdbx_drop.c mdbx_chk_LDADD = libmdbx.la mdbx_copy_LDADD = libmdbx.la mdbx_dump_LDADD = libmdbx.la mdbx_load_LDADD = libmdbx.la mdbx_stat_LDADD = libmdbx.la +mdbx_drop_LDADD = libmdbx.la diff --git a/servers/slapd/back-mdb/back-mdb.h b/servers/slapd/back-mdb/back-mdb.h index 169b0e41d0..6ff294bab9 100644 --- a/servers/slapd/back-mdb/back-mdb.h +++ b/servers/slapd/back-mdb/back-mdb.h @@ -18,6 +18,8 @@ #include #include "slap.h" + +#define MDBX_DEPRECATED #include "mdbx.h" #ifndef mdbx_cmp2int diff --git a/servers/slapd/back-mdb/config.c b/servers/slapd/back-mdb/config.c index efc5d6f1eb..ca3848e08e 100644 --- a/servers/slapd/back-mdb/config.c +++ b/servers/slapd/back-mdb/config.c @@ -156,7 +156,7 @@ static ConfigOCs mdbocs[] = { static slap_verbmasks mdb_envflags[] = { {BER_BVC("nosync"), MDBX_UTTERLY_NOSYNC}, - {BER_BVC("lazysync"), MDBX_NOSYNC}, + {BER_BVC("lazysync"), MDBX_SAFE_NOSYNC}, {BER_BVC("nometasync"), MDBX_NOMETASYNC}, {BER_BVC("writemap"), MDBX_WRITEMAP}, {BER_BVC("mapasync"), MDBX_MAPASYNC}, @@ -175,7 +175,7 @@ static void *mdb_checkpoint(void *ctx, void *arg) { struct mdb_info *mdb = rtask->arg; (void)ctx; - mdbx_env_sync(mdb->mi_dbenv, 1); + mdbx_env_sync(mdb->mi_dbenv); ldap_pvt_thread_mutex_lock(&slapd_rq.rq_mutex); ldap_pvt_runqueue_stoptask(&slapd_rq, rtask); ldap_pvt_thread_mutex_unlock(&slapd_rq.rq_mutex); diff --git a/servers/slapd/back-mdb/idl.c b/servers/slapd/back-mdb/idl.c index 0c56b5e71b..7c4b26752b 100644 --- a/servers/slapd/back-mdb/idl.c +++ b/servers/slapd/back-mdb/idl.c @@ -450,7 +450,7 @@ int mdb_idl_insert_keys(BackendDB *be, MDBX_cursor *cursor, struct berval *keys, hi = id; } /* delete the old key */ - rc = mdbx_cursor_del(cursor, MDBX_NODUPDATA); + rc = mdbx_cursor_del(cursor, MDBX_ALLDUPS); if (rc != 0) { err = "c_del dups"; goto fail; @@ -1186,11 +1186,9 @@ unsigned mdb_id2l_search(ID2L ids, ID id) { if (val < 0) { n = pivot; - } else if (val > 0) { base = cursor; n -= pivot + 1; - } else { return cursor; } diff --git a/servers/slapd/back-mdb/init.c b/servers/slapd/back-mdb/init.c index 6c26e92494..2b4246510e 100644 --- a/servers/slapd/back-mdb/init.c +++ b/servers/slapd/back-mdb/init.c @@ -34,32 +34,26 @@ static int mdb_id_compare(const MDBX_val *a, const MDBX_val *b) { return mdbx_cmp2int(*(ID *)a->iov_base, *(ID *)b->iov_base); } -static void mdbx_debug(int type, const char *function, int line, +static void mdbx_debug(MDBX_log_level_t log, const char *function, int line, const char *msg, va_list args) { -#if LDAP_DEBUG > 1 - int level = LDAP_DEBUG_ANY; -#else - int level = 0; - - if (type & MDBX_DBG_ASSERT) - level |= LDAP_DEBUG_ANY; - - if (type & MDBX_DBG_PRINT) - level |= LDAP_DEBUG_NONE; - - if (type & (MDBX_DBG_TRACE | MDBX_DBG_EXTRA)) - level |= LDAP_DEBUG_TRACE; -#endif /* LDAP_DEBUG */ - - if (DebugTest(level)) - ldap_debug_va(msg, args); + int level; + if (log < MDBX_LOG_VERBOSE) + level = LDAP_DEBUG_ANY; + else if (log == MDBX_LOG_VERBOSE) + level = LDAP_DEBUG_NONE; + else + level = LDAP_DEBUG_TRACE; + + vLog(level, (int)log, msg, args); } /* perform kick/kill a laggard readers */ -static int mdb_oom_handler(MDBX_env *env, int pid, mdbx_tid_t tid, - uint64_t txnid, unsigned gap, int retry) { +static int mdb_oom_handler(const MDBX_env *env, const MDBX_txn *txn, + mdbx_pid_t pid, mdbx_tid_t tid, uint64_t laggard, + unsigned gap, size_t space, int retry) { uint64_t now_ns = ldap_now_steady_ns(); struct mdb_info *mdb = mdbx_env_get_userctx(env); + uint64_t txnid = mdbx_txn_id(txn); (void)tid; if (retry < 0) { @@ -83,7 +77,7 @@ static int mdb_oom_handler(MDBX_env *env, int pid, mdbx_tid_t tid, } mdb->mi_oom_timestamp_ns = 0; - return 0; + return -1; } if (!mdb->mi_oom_flags) @@ -129,20 +123,30 @@ static int mdb_db_init(BackendDB *be, ConfigReply *cr) { LDAP_XSTRING(mdb_db_init) ": Initializing mdb database\n"); /* TODO: MDBX_DBG_AUDIT, MDBX_DBG_DUMP */ - unsigned flags = mdbx_setup_debug(0, mdbx_debug); - flags &= ~(MDBX_DBG_ASSERT | MDBX_DBG_JITTER); + int bits = + mdbx_setup_debug(MDBX_LOG_DONTCHANGE, MDBX_DBG_DONTCHANGE, mdbx_debug); + int loglevel = bits & 7; + int dbgflags = bits - loglevel; + dbgflags &= ~(MDBX_DBG_ASSERT | MDBX_DBG_JITTER); + dbgflags |= MDBX_DBG_LEGACY_OVERLAP; if (reopenldap_mode_check()) - flags |= MDBX_DBG_ASSERT; + dbgflags |= MDBX_DBG_ASSERT; if (reopenldap_mode_jitter()) - flags |= MDBX_DBG_JITTER; + dbgflags |= MDBX_DBG_JITTER; + + if (loglevel < MDBX_LOG_WARN) + loglevel = MDBX_LOG_WARN; #if LDAP_DEBUG > 1 - flags |= MDBX_DBG_PRINT | MDBX_DBG_TRACE; + if (loglevel < MDBX_LOG_VERBOSE) + MDBX_LOG_VERBOSE = MDBX_LOG_VERBOSE; #endif /* LDAP_DEBUG > 1 */ #if LDAP_DEBUG > 2 - flags |= MDBX_DBG_EXTRA; + if (loglevel < MDBX_LOG_EXTRA) + loglevel = MDBX_LOG_EXTRA; #endif /* LDAP_DEBUG > 2 */ - mdbx_setup_debug(flags, mdbx_debug); + mdbx_setup_debug((MDBX_log_level_t)loglevel, (MDBX_debug_flags_t)dbgflags, + mdbx_debug); /* allocate backend-database-specific stuff */ mdb = (struct mdb_info *)ch_calloc(1, sizeof(struct mdb_info)); @@ -250,16 +254,7 @@ static int mdb_db_open(BackendDB *be, ConfigReply *cr) { goto fail; } - rc = mdbx_env_set_syncbytes(mdb->mi_dbenv, mdb->mi_txn_cp_kbyte * 1024ul); - if (rc != 0) { - Debug(LDAP_DEBUG_ANY, - LDAP_XSTRING(mdb_db_open) ": database \"%s\": " - "mdbx_env_set_syncbytes failed: %s (%d).\n", - be->be_suffix[0].bv_val, mdbx_strerror(rc), rc); - goto fail; - } - - mdbx_env_set_oomfunc(mdb->mi_dbenv, mdb_oom_handler); + mdbx_env_set_hsr(mdb->mi_dbenv, mdb_oom_handler); if ((slapMode & SLAP_SERVER_MODE) && SLAP_MULTIMASTER(be) && ((MDBX_OOM_YIELD & mdb->mi_oom_flags) == 0 || mdb->mi_renew_lag == 0)) { snprintf(cr->msg, sizeof(cr->msg), @@ -283,7 +278,7 @@ static int mdb_db_open(BackendDB *be, ConfigReply *cr) { flags |= MDBX_PAGEPERTURB; if (slapMode & SLAP_TOOL_QUICK) - flags |= MDBX_NOSYNC | MDBX_WRITEMAP; + flags |= MDBX_SAFE_NOSYNC | MDBX_WRITEMAP; if (slapMode & SLAP_TOOL_READONLY) flags |= MDBX_RDONLY; @@ -299,6 +294,18 @@ static int mdb_db_open(BackendDB *be, ConfigReply *cr) { goto fail; } + if ((slapMode & SLAP_TOOL_READONLY) == 0) { + rc = mdbx_env_set_syncbytes(mdb->mi_dbenv, mdb->mi_txn_cp_kbyte * 1024ul); + if (rc != 0) { + Debug( + LDAP_DEBUG_ANY, + LDAP_XSTRING(mdb_db_open) ": database \"%s\": " + "mdbx_env_set_syncbytes failed: %s (%d).\n", + be->be_suffix[0].bv_val, mdbx_strerror(rc), rc); + goto fail; + } + } + rc = mdbx_txn_begin(mdb->mi_dbenv, NULL, flags & MDBX_RDONLY, &txn); if (rc) { Debug(LDAP_DEBUG_ANY, @@ -445,8 +452,8 @@ static int mdb_db_close(BackendDB *be, ConfigReply *cr) { * and not in Quick mode. */ if (!(slapMode & (SLAP_TOOL_QUICK | SLAP_TOOL_READONLY))) { - rc = mdbx_env_sync(mdb->mi_dbenv, 1); - if (rc != 0) { + rc = mdbx_env_sync(mdb->mi_dbenv); + if (rc != MDBX_SUCCESS && rc != MDBX_RESULT_TRUE) { Debug(LDAP_DEBUG_ANY, "mdb_db_close: database \"%s\": " "mdb_env_sync failed: %s (%d).\n", diff --git a/servers/slapd/main.c b/servers/slapd/main.c index bdb765e6c6..40aa11e3ff 100644 --- a/servers/slapd/main.c +++ b/servers/slapd/main.c @@ -940,6 +940,7 @@ int main(int argc, char **argv) { if (!no_detach) { int ignore __maybe_unused = write(waitfds[1], "1", 1); close(waitfds[1]); + ldap_debug_mask = 0; } rc = slapd_daemon();