Save/restore enc IV in page 0

mdb.master3
Howard Chu 7 years ago
parent 34c3cfe853
commit fafbd42cd2
  1. 24
      libraries/liblmdb/mdb.c

@ -4213,6 +4213,15 @@ mdb_env_init_meta(MDB_env *env, MDB_meta *meta)
q->mp_flags = P_META;
*(MDB_meta *)METADATA(q) = *meta;
#if MDB_RPAGE_CACHE
if ((env->me_flags & MDB_ENCRYPT) && env->me_enckey[1].mv_size) {
/* save the IV in tail of page 0 */
char *ptr = (char *)q;
unsigned short *u = (unsigned short *)(ptr-2);
*u = env->me_enckey[1].mv_size;
memcpy(ptr - 2 - env->me_enckey[1].mv_size, env->me_enckey[1].mv_data, env->me_enckey[1].mv_size);
}
#endif
DO_PWRITE(rc, env->me_fd, p, psize * NUM_METAS, len, 0);
if (!rc)
rc = ErrCode();
@ -4914,6 +4923,21 @@ mdb_env_open2(MDB_env *env)
if ((env->me_flags ^ env->me_metas[0]->mm_flags) & MDB_ENCRYPT)
return MDB_INCOMPATIBLE;
#if MDB_RPAGE_CACHE
if (!newenv && env->me_flags & MDB_ENCRYPT) {
/* for encrypted env, read IV from tail of page 0 */
char *ptr = env->me_map + env->me_psize, *ekey;
unsigned short *u = (unsigned short *)(ptr - 2);
env->me_enckey[1].mv_size = *u;
ekey = realloc(env->me_enckey[0].mv_data, env->me_enckey[0].mv_size + env->me_enckey[1].mv_size);
if (!ekey)
return ENOMEM;
env->me_enckey[0].mv_data = ekey;
env->me_enckey[1].mv_data = ekey + env->me_enckey[0].mv_size;
memcpy(env->me_enckey[1].mv_data, ptr - 2 - env->me_enckey[1].mv_size, env->me_enckey[1].mv_size);
}
#endif
env->me_maxfree_1pg = (env->me_psize - PAGEHDRSZ) / sizeof(pgno_t) - 1;
env->me_nodemax = (((env->me_psize - PAGEHDRSZ) / MDB_MINKEYS) & -2)
- sizeof(indx_t);

Loading…
Cancel
Save