diff --git a/.gitignore b/.gitignore index 1b664050..e407d9c4 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,9 @@ *.orig *.rej *.so +*.dll +*.dylib +*.dSYM *[~#] .idea .le.ini diff --git a/ChangeLog.md b/ChangeLog.md index 1ddb5d30..2a1238f9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -30,10 +30,10 @@ New features: Fixes: - - Fixed 4-byte aligned access to 64-bit integers. - Fixed missing cleanup (null assigned) in the C++ commit/abort (https://github.com/erthink/libmdbx/pull/143). - Fixed `mdbx_realloc()` for case of nullptr and `MDBX_AVOID_CRT=ON` for Windows. - Fixed the possibility to use invalid and renewed (closed & re-opened, dropped & re-created) DBI-handles (https://github.com/erthink/libmdbx/issues/146). + - Fixed 4-byte aligned access to 64-bit integers, including access to the `bootid` meta-page's field (https://github.com/erthink/libmdbx/issues/153). ## v0.9.2 scheduled at 2020-11-27 diff --git a/GNUmakefile b/GNUmakefile index 34d40681..b065078b 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -72,7 +72,7 @@ strip: all strip libmdbx.$(SO_SUFFIX) $(TOOLS) clean: - rm -rf $(TOOLS) mdbx_test @* *.[ao] *.[ls]o *~ tmp.db/* \ + rm -rf $(TOOLS) mdbx_test @* *.[ao] *.[ls]o *.$(SO_SUFFIX) *.dSYM *~ tmp.db/* \ *.gcov *.log *.err src/*.o test/*.o mdbx_example dist \ config.h src/config.h src/version.c *.tar* diff --git a/mdbx.h b/mdbx.h index e4ae65cd..7fe1464d 100644 --- a/mdbx.h +++ b/mdbx.h @@ -823,7 +823,7 @@ DEFINE_ENUM_FLAG_OPERATORS(MDBX_debug_flags_t) * \param [in] env An environment handle returned by \ref mdbx_env_create(). * \param [in] msg The assertion message, not including newline. */ typedef void MDBX_debug_func(MDBX_log_level_t loglevel, const char *function, - int line, const char *msg, + int line, const char *fmt, va_list args) MDBX_CXX17_NOEXCEPT; /** \brief The "don't change `logger`" value for mdbx_setup_debug() */ diff --git a/src/core.c b/src/core.c index 51fec3e5..8fe79d12 100644 --- a/src/core.c +++ b/src/core.c @@ -4415,7 +4415,7 @@ bailout: /*----------------------------------------------------------------------------*/ static __always_inline bool meta_bootid_match(const MDBX_meta *meta) { - return meta->mm_bootid.x == bootid.x && meta->mm_bootid.y == bootid.y && + return memcmp(&meta->mm_bootid, &bootid, 16) == 0 && (bootid.x | bootid.y) != 0; } @@ -4467,7 +4467,7 @@ static __inline void mdbx_meta_update_end(const MDBX_env *env, MDBX_meta *meta, mdbx_assert(env, unaligned_peek_u64(4, meta->mm_txnid_b) < txnid); (void)env; mdbx_jitter4testing(true); - meta->mm_bootid = bootid; + memcpy(&meta->mm_bootid, &bootid, 16); unaligned_poke_u64(4, meta->mm_txnid_b, txnid); } @@ -4477,7 +4477,7 @@ static __inline void mdbx_meta_set_txnid(const MDBX_env *env, MDBX_meta *meta, (void)env; /* update inconsistent since this function used ONLY for filling meta-image * for writing, but not the actual meta-page */ - meta->mm_bootid = bootid; + memcpy(&meta->mm_bootid, &bootid, 16); unaligned_poke_u64(4, meta->mm_txnid_a, txnid); unaligned_poke_u64(4, meta->mm_txnid_b, txnid); } @@ -17328,12 +17328,9 @@ __cold int mdbx_env_info_ex(const MDBX_env *env, const MDBX_txn *txn, arg->mi_meta2_txnid = mdbx_meta_txnid_fluid(env, meta2); arg->mi_meta2_sign = unaligned_peek_u64(4, meta2->mm_datasync_sign); if (likely(bytes > size_before_bootid)) { - arg->mi_bootid.meta0.x = meta0->mm_bootid.x; - arg->mi_bootid.meta1.x = meta0->mm_bootid.x; - arg->mi_bootid.meta2.x = meta0->mm_bootid.x; - arg->mi_bootid.meta0.y = meta0->mm_bootid.y; - arg->mi_bootid.meta1.y = meta0->mm_bootid.y; - arg->mi_bootid.meta2.y = meta0->mm_bootid.y; + memcpy(&arg->mi_bootid.meta0, &meta0->mm_bootid, 16); + memcpy(&arg->mi_bootid.meta1, &meta1->mm_bootid, 16); + memcpy(&arg->mi_bootid.meta2, &meta2->mm_bootid, 16); } const MDBX_meta *txn_meta = recent_meta;