mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-21 21:28:20 +08:00
mdbx: more checks for meta-params.
This commit is contained in:
parent
9eeb00f448
commit
700f3e9c2a
23
src/mdbx.c
23
src/mdbx.c
@ -3798,6 +3798,8 @@ static int __cold mdbx_setup_dxb(MDBX_env *env, int lck_rc) {
|
|||||||
if (env->me_psize > MAX_PAGESIZE)
|
if (env->me_psize > MAX_PAGESIZE)
|
||||||
env->me_psize = MAX_PAGESIZE;
|
env->me_psize = MAX_PAGESIZE;
|
||||||
|
|
||||||
|
assert(is_power2(env->me_psize));
|
||||||
|
assert(env->me_psize >= MIN_PAGESIZE);
|
||||||
env->me_mapsize = roundup2(
|
env->me_mapsize = roundup2(
|
||||||
env->me_mapsize ? env->me_mapsize : DEFAULT_MAPSIZE, env->me_os_psize);
|
env->me_mapsize ? env->me_mapsize : DEFAULT_MAPSIZE, env->me_os_psize);
|
||||||
|
|
||||||
@ -3822,6 +3824,11 @@ static int __cold mdbx_setup_dxb(MDBX_env *env, int lck_rc) {
|
|||||||
return err;
|
return err;
|
||||||
} else {
|
} else {
|
||||||
env->me_psize = meta.mm_psize;
|
env->me_psize = meta.mm_psize;
|
||||||
|
if (!is_power2(env->me_psize) || env->me_psize < MIN_PAGESIZE) {
|
||||||
|
mdbx_error("wrong pagesize %u (system %u)", env->me_psize,
|
||||||
|
env->me_os_psize);
|
||||||
|
return MDBX_WANNA_RECOVERY;
|
||||||
|
}
|
||||||
|
|
||||||
/* Make sure mapsize >= committed data size. Even when using
|
/* Make sure mapsize >= committed data size. Even when using
|
||||||
* mm_mapsize, which could be broken in old files (ITS#7789). */
|
* mm_mapsize, which could be broken in old files (ITS#7789). */
|
||||||
@ -3846,8 +3853,10 @@ static int __cold mdbx_setup_dxb(MDBX_env *env, int lck_rc) {
|
|||||||
mdbx_notice("filesize mismatch (wanna %" PRIu64 ", have %" PRIu64 ")",
|
mdbx_notice("filesize mismatch (wanna %" PRIu64 ", have %" PRIu64 ")",
|
||||||
env->me_mapsize, size);
|
env->me_mapsize, size);
|
||||||
if ((env->me_flags & MDBX_RDONLY) ||
|
if ((env->me_flags & MDBX_RDONLY) ||
|
||||||
lck_rc != /* lck exclusive */ MDBX_RESULT_TRUE)
|
lck_rc != /* lck exclusive */ MDBX_RESULT_TRUE) {
|
||||||
|
mdbx_error("exclusive, but read-only, unable ftruncate/set-size");
|
||||||
return MDBX_WANNA_RECOVERY /* LY: could not mdbx_ftruncate */;
|
return MDBX_WANNA_RECOVERY /* LY: could not mdbx_ftruncate */;
|
||||||
|
}
|
||||||
|
|
||||||
err = mdbx_ftruncate(env->me_fd, env->me_mapsize);
|
err = mdbx_ftruncate(env->me_fd, env->me_mapsize);
|
||||||
if (unlikely(err != MDBX_SUCCESS))
|
if (unlikely(err != MDBX_SUCCESS))
|
||||||
@ -3887,12 +3896,12 @@ static int __cold mdbx_setup_dxb(MDBX_env *env, int lck_rc) {
|
|||||||
} else if (!env->me_lck) {
|
} else if (!env->me_lck) {
|
||||||
/* LY: without-lck (read-only) mode, so it is imposible that other
|
/* LY: without-lck (read-only) mode, so it is imposible that other
|
||||||
* process made weak checkpoint. */
|
* process made weak checkpoint. */
|
||||||
mdbx_trace("without-lck, unable recovery/rollback");
|
mdbx_error("without-lck, unable recovery/rollback");
|
||||||
return MDBX_WANNA_RECOVERY;
|
return MDBX_WANNA_RECOVERY;
|
||||||
} else {
|
} else {
|
||||||
/* LY: assume just have a collision with other running process,
|
/* LY: assume just have a collision with other running process,
|
||||||
* or someone make a weak checkpoint */
|
* or someone make a weak checkpoint */
|
||||||
mdbx_trace("assume collision or online weak checkpoint");
|
mdbx_info("assume collision or online weak checkpoint");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3973,7 +3982,7 @@ static int __cold mdbx_setup_lck(MDBX_env *env, char *lck_pathname, int mode) {
|
|||||||
const uint64_t maxreaders =
|
const uint64_t maxreaders =
|
||||||
(size - sizeof(MDBX_lockinfo)) / sizeof(MDBX_reader) + 1;
|
(size - sizeof(MDBX_lockinfo)) / sizeof(MDBX_reader) + 1;
|
||||||
if (maxreaders > UINT16_MAX) {
|
if (maxreaders > UINT16_MAX) {
|
||||||
mdbx_notice("lck-size too big (up to %" PRIu64 " readers)", maxreaders);
|
mdbx_error("lck-size too big (up to %" PRIu64 " readers)", maxreaders);
|
||||||
return MDBX_PROBLEM;
|
return MDBX_PROBLEM;
|
||||||
}
|
}
|
||||||
env->me_maxreaders = (unsigned)maxreaders;
|
env->me_maxreaders = (unsigned)maxreaders;
|
||||||
@ -4019,11 +4028,11 @@ static int __cold mdbx_setup_lck(MDBX_env *env, char *lck_pathname, int mode) {
|
|||||||
env->me_lck->mti_format = MDBX_LOCK_FORMAT;
|
env->me_lck->mti_format = MDBX_LOCK_FORMAT;
|
||||||
} else {
|
} else {
|
||||||
if (env->me_lck->mti_magic != MDBX_MAGIC) {
|
if (env->me_lck->mti_magic != MDBX_MAGIC) {
|
||||||
mdbx_debug("lock region has invalid magic");
|
mdbx_error("lock region has invalid magic");
|
||||||
return MDBX_INVALID;
|
return MDBX_INVALID;
|
||||||
}
|
}
|
||||||
if (env->me_lck->mti_format != MDBX_LOCK_FORMAT) {
|
if (env->me_lck->mti_format != MDBX_LOCK_FORMAT) {
|
||||||
mdbx_debug("lock region has format+version 0x%" PRIx64
|
mdbx_error("lock region has format+version 0x%" PRIx64
|
||||||
", expected 0x%" PRIx64,
|
", expected 0x%" PRIx64,
|
||||||
env->me_lck->mti_format, MDBX_LOCK_FORMAT);
|
env->me_lck->mti_format, MDBX_LOCK_FORMAT);
|
||||||
return MDBX_VERSION_MISMATCH;
|
return MDBX_VERSION_MISMATCH;
|
||||||
@ -4148,7 +4157,7 @@ int __cold mdbx_env_open_ex(MDBX_env *env, const char *path, unsigned flags,
|
|||||||
*exclusive = 0;
|
*exclusive = 0;
|
||||||
}
|
}
|
||||||
if ((env->me_lck->mti_envmode ^ env->me_flags) & mode_flags) {
|
if ((env->me_lck->mti_envmode ^ env->me_flags) & mode_flags) {
|
||||||
/* LY: Current mode/flags incompatible with requested. */
|
mdbx_error("current mode/flags incompatible with requested");
|
||||||
rc = MDBX_INCOMPATIBLE;
|
rc = MDBX_INCOMPATIBLE;
|
||||||
goto bailout;
|
goto bailout;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user