Add patch to limit database expansion, was causing OOMs in SSSD in some

extreme situations.
This commit is contained in:
Simo Sorce 2011-04-05 11:50:10 -04:00
parent 24af4293dc
commit 00e3e0e9b6
2 changed files with 41 additions and 1 deletions

View File

@ -6,7 +6,7 @@
Name: libtdb
Version: 1.2.9
Release: 9%{?dist}
Release: 10%{?dist}
Group: System Environment/Daemons
Summary: The tdb library
License: LGPLv3+
@ -21,6 +21,7 @@ BuildRequires: python-devel
# Patches
Patch0001: 0001-Install-python-bindings-in-the-arch-specific-locatio.patch
Patch0002: tdb-1.2.9-limit-tdb_expand.patch
%description
A library that implements a trivial database.
@ -53,6 +54,7 @@ Python bindings for libtdb
%prep
%setup -q -n tdb-%{version}
%patch0001 -p1
%patch0002 -p1
%build
./autogen.sh
@ -107,6 +109,10 @@ rm -rf $RPM_BUILD_ROOT
%postun -n python-tdb -p /sbin/ldconfig
%changelog
* Tue Apr 5 2011 Simo Sorce <ssorce@redhat.com> - 1.2.9-9
- Add patch to limit database expansion, was causing OOMs in SSSD in some
extreme situations.
* Tue Feb 08 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.2.9-9
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild

View File

@ -0,0 +1,34 @@
diff -uPpr tdb-1.2.9/common/io.c tdb-1.2.9.fix/common/io.c
--- tdb-1.2.9/common/io.c 2010-10-13 21:08:49.000000000 -0400
+++ tdb-1.2.9.fix/common/io.c 2011-04-05 11:47:14.761341926 -0400
@@ -299,7 +299,7 @@ static int tdb_expand_file(struct tdb_co
int tdb_expand(struct tdb_context *tdb, tdb_off_t size)
{
struct tdb_record rec;
- tdb_off_t offset, new_size;
+ tdb_off_t offset, new_size, top_size;
if (tdb_lock(tdb, -1, F_WRLCK) == -1) {
TDB_LOG((tdb, TDB_DEBUG_ERROR, "lock failed in tdb_expand\n"));
@@ -309,10 +309,18 @@ int tdb_expand(struct tdb_context *tdb,
/* must know about any previous expansions by another process */
tdb->methods->tdb_oob(tdb, tdb->map_size + 1, 1);
+ /* limit size in order to avoid using up huge amounts of memory for
+ * in memory tdbs if an oddball huge record creeps in */
+ if (size > 100 * 1024) {
+ top_size = size * 2;
+ } else {
+ top_size = size * 100;
+ }
+
/* always make room for at least 100 more records, and at
- least 25% more space. Round the database up to a multiple
- of the page size */
- new_size = MAX(tdb->map_size + size*100, tdb->map_size * 1.25);
+ least 25% more space. Round the database up to a multiple
+ of the page size */
+ new_size = MAX(tdb->map_size + top_size, tdb->map_size * 1.25);
size = TDB_ALIGN(new_size, tdb->page_size) - tdb->map_size;
if (!(tdb->flags & TDB_INTERNAL))