]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Save/restore enc IV in page 0
authorHoward Chu <hyc@openldap.org>
Fri, 30 Jun 2017 15:30:29 +0000 (16:30 +0100)
committerHoward Chu <hyc@openldap.org>
Sat, 10 Oct 2020 11:52:37 +0000 (12:52 +0100)
libraries/liblmdb/mdb.c

index c25f2d4f168a37167cbba576ad3555c619260d94..2e91fece3d9a46243745b22c8561c498de2fbc8d 100644 (file)
@@ -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);