Hello community, here is the log from the commit of package lmdb for openSUSE:Factory checked in at 2018-10-12 13:07:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/lmdb (Old) and /work/SRC/openSUSE:Factory/.lmdb.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "lmdb" Fri Oct 12 13:07:39 2018 rev:14 rq:640739 version:0.9.22 Changes: -------- --- /work/SRC/openSUSE:Factory/lmdb/lmdb.changes 2018-06-05 12:51:18.281169328 +0200 +++ /work/SRC/openSUSE:Factory/.lmdb.new/lmdb.changes 2018-10-12 13:07:41.167557088 +0200 @@ -1,0 +2,6 @@ +Sat Oct 6 14:18:37 UTC 2018 - Stefan BrĂ¼ns <[email protected]> + +- Fix occasional crash when freed pages landed on the dirty list twice + * Add 0001-ITS-8756-remove-loose-pg-from-dirty-list-in-freelist.patch + +------------------------------------------------------------------- New: ---- 0001-ITS-8756-remove-loose-pg-from-dirty-list-in-freelist.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ lmdb.spec ++++++ --- /var/tmp/diff_new_pack.3c1sfM/_old 2018-10-12 13:07:42.455555247 +0200 +++ /var/tmp/diff_new_pack.3c1sfM/_new 2018-10-12 13:07:42.459555241 +0200 @@ -12,7 +12,7 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # @@ -35,6 +35,8 @@ Patch2: liblmdb-implicit-decl.patch # PATCH-FIX-OPENSUSE - Build and link to shared library Patch3: Makefile-build-use-shared-lib.patch +# PATCH-FIX-UPSTREAM - Fix crash due to failed assertion, freed pages ended up on the dirty page list twice +Patch4: 0001-ITS-8756-remove-loose-pg-from-dirty-list-in-freelist.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build %if 0%{?rhel_version} == 700 @@ -87,6 +89,7 @@ %patch1 -p1 %patch2 -p1 %patch3 -p1 +%patch4 -p1 %build cd libraries/liblmdb ++++++ 0001-ITS-8756-remove-loose-pg-from-dirty-list-in-freelist.patch ++++++ >From 5e51a5b9f41880cac3d1bf621630de80e15de224 Mon Sep 17 00:00:00 2001 From: Howard Chu <[email protected]> Date: Fri, 22 Jun 2018 16:30:13 +0100 Subject: [PATCH] ITS#8756 remove loose pg from dirty list in freelist_save --- libraries/liblmdb/mdb.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index d9e7c5e1e..77c6ecd89 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -3094,10 +3094,41 @@ mdb_freelist_save(MDB_txn *txn) * we may be unable to return them to me_pghead. */ MDB_page *mp = txn->mt_loose_pgs; + MDB_ID2 *dl = txn->mt_u.dirty_list; + unsigned x; if ((rc = mdb_midl_need(&txn->mt_free_pgs, txn->mt_loose_count)) != 0) return rc; - for (; mp; mp = NEXT_LOOSE_PAGE(mp)) + for (; mp; mp = NEXT_LOOSE_PAGE(mp)) { mdb_midl_xappend(txn->mt_free_pgs, mp->mp_pgno); + /* must also remove from dirty list */ + if (txn->mt_flags & MDB_TXN_WRITEMAP) { + for (x=1; x<=dl[0].mid; x++) + if (dl[x].mid == mp->mp_pgno) + break; + mdb_tassert(txn, x <= dl[0].mid); + } else { + x = mdb_mid2l_search(dl, mp->mp_pgno); + mdb_tassert(txn, dl[x].mid == mp->mp_pgno); + } + dl[x].mptr = NULL; + mdb_dpage_free(env, mp); + } + { + /* squash freed slots out of the dirty list */ + unsigned y; + for (y=1; dl[y].mptr && y <= dl[0].mid; y++); + if (y <= dl[0].mid) { + for(x=y, y++;;) { + while (!dl[y].mptr && y <= dl[0].mid) y++; + if (y > dl[0].mid) break; + dl[x++] = dl[y++]; + } + dl[0].mid = x-1; + } else { + /* all slots freed */ + dl[0].mid = 0; + } + } txn->mt_loose_pgs = NULL; txn->mt_loose_count = 0; } -- 2.19.0
