Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
Please unblock package xapian-core
This update contains the following changes compared to the version
currently in testing (1.2.12-1):
Fixes grave bug http://bugs.debian.org/695542 ("Concurrent threads can
succeed in locking database").
Fixes bug http://bugs.debian.org/695643 ("Database replication fails for
files > 32GB") which is a small and safe patch relevant to the LFS release
goal: http://wiki.debian.org/ReleaseGoals/LFS
I've attached a debdiff against 1.2.12-1 (currently in testing), and
for your reviewing convenience, the two new patches individually.
Cheers,
Olly
unblock xapian-core/1.2.12-2
-- System Information:
Debian Release: wheezy/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: amd64 (x86_64)
Kernel: Linux 3.2.0-4-amd64 (SMP w/8 CPU cores)
Locale: LANG=en_GB.utf8, LC_CTYPE=en_GB.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
diff -Nru xapian-core-1.2.12/debian/changelog xapian-core-1.2.12/debian/changelog
--- xapian-core-1.2.12/debian/changelog 2012-06-28 19:54:11.000000000 +1200
+++ xapian-core-1.2.12/debian/changelog 2012-12-11 17:22:23.000000000 +1300
@@ -1,3 +1,13 @@
+xapian-core (1.2.12-2) unstable; urgency=low
+
+ * New patch fix-db-write-lock.patch which fixes database write locking to
+ work when the lock file is already open in the same process.
+ (Closes: #695542)
+ * New patch replication-above-32GB.patch which fixes database replication to
+ handle files > 32GB. (Closes: #695643)
+
+ -- Olly Betts <olly@survex.com> Tue, 11 Dec 2012 04:22:04 +0000
+
xapian-core (1.2.12-1) unstable; urgency=low
* New upstream release.
diff -Nru xapian-core-1.2.12/debian/patches/fix-db-write-lock.patch xapian-core-1.2.12/debian/patches/fix-db-write-lock.patch
--- xapian-core-1.2.12/debian/patches/fix-db-write-lock.patch 1970-01-01 12:00:00.000000000 +1200
+++ xapian-core-1.2.12/debian/patches/fix-db-write-lock.patch 2012-12-11 17:25:07.000000000 +1300
@@ -0,0 +1,62 @@
+Taken from 1.2 branch of upstream SVN r16938.
+
+--- a/backends/flint_lock.cc (revision 16937)
++++ b/backends/flint_lock.cc (revision 16938)
+@@ -2,5 +2,5 @@
+ * @brief Flint-compatible database locking.
+ */
+-/* Copyright (C) 2005,2006,2007,2008,2009,2010,2011 Olly Betts
++/* Copyright (C) 2005,2006,2007,2008,2009,2010,2011,2012 Olly Betts
+ *
+ * This program is free software; you can redistribute it and/or
+@@ -134,4 +134,20 @@
+ close(fds[0]);
+
++ // Connect pipe to stdin and stdout.
++ dup2(fds[1], 0);
++ dup2(fds[1], 1);
++
++ // Make sure we don't hang on to open files which may get deleted but
++ // not have their disk space released until we exit. Close these
++ // before we try to get the lock because if one of them is open on
++ // the lock file then closing it after obtaining the lock would release
++ // the lock, which would be really bad.
++ for (int i = 2; i < lockfd; ++i) {
++ // Retry on EINTR; just ignore other errors (we'll get
++ // EBADF if the fd isn't open so that's OK).
++ while (close(i) < 0 && errno == EINTR) { }
++ }
++ closefrom(lockfd + 1);
++
+ reason why = SUCCESS;
+ {
+@@ -160,5 +176,5 @@
+ // Tell the parent if we got the lock, and if not, why not.
+ char ch = static_cast<char>(why);
+- while (write(fds[1], &ch, 1) < 0) {
++ while (write(1, &ch, 1) < 0) {
+ // EINTR means a signal interrupted us, so retry.
+ // Otherwise we're DOOMED! The best we can do is just exit
+@@ -169,8 +185,4 @@
+ if (why != SUCCESS) _exit(0);
+ }
+-
+- // Connect pipe to stdin and stdout.
+- dup2(fds[1], 0);
+- dup2(fds[1], 1);
+
+ // Make sure we don't block unmount() of partition holding the current
+@@ -184,13 +196,4 @@
+ // gives a warning even if we cast the result to void.
+ }
+-
+- // Make sure we don't hang on to open files which may get deleted but
+- // not have their disk space released until we exit.
+- for (int i = 2; i < lockfd; ++i) {
+- // Retry on EINTR; just ignore other errors (we'll get
+- // EBADF if the fd isn't open so that's OK).
+- while (close(i) < 0 && errno == EINTR) { }
+- }
+- closefrom(lockfd + 1);
+
+ // FIXME: use special statically linked helper instead of cat.
diff -Nru xapian-core-1.2.12/debian/patches/replication-above-32GB.patch xapian-core-1.2.12/debian/patches/replication-above-32GB.patch
--- xapian-core-1.2.12/debian/patches/replication-above-32GB.patch 1970-01-01 12:00:00.000000000 +1200
+++ xapian-core-1.2.12/debian/patches/replication-above-32GB.patch 2012-12-11 17:25:13.000000000 +1300
@@ -0,0 +1,13 @@
+Taken from 1.2 branch of upstream SVN r16915.
+
+--- a/net/remoteconnection.cc (revision 16348)
++++ b/net/remoteconnection.cc (revision 16915)
+@@ -618,5 +618,7 @@
+ int shift = 0;
+ do {
+- if (i == buffer.end() || shift > 28) {
++ // Allow a full 64 bits for message lengths - anything longer than that
++ // is almost certainly a corrupt value.
++ if (i == buffer.end() || shift > 63) {
+ // Something is very wrong...
+ throw Xapian::NetworkError("Insane message length specified!");
diff -Nru xapian-core-1.2.12/debian/patches/series xapian-core-1.2.12/debian/patches/series
--- xapian-core-1.2.12/debian/patches/series 1970-01-01 12:00:00.000000000 +1200
+++ xapian-core-1.2.12/debian/patches/series 2012-12-11 17:22:00.000000000 +1300
@@ -0,0 +1,2 @@
+fix-db-write-lock.patch
+replication-above-32GB.patch
Taken from 1.2 branch of upstream SVN r16938.
--- a/backends/flint_lock.cc (revision 16937)
+++ b/backends/flint_lock.cc (revision 16938)
@@ -2,5 +2,5 @@
* @brief Flint-compatible database locking.
*/
-/* Copyright (C) 2005,2006,2007,2008,2009,2010,2011 Olly Betts
+/* Copyright (C) 2005,2006,2007,2008,2009,2010,2011,2012 Olly Betts
*
* This program is free software; you can redistribute it and/or
@@ -134,4 +134,20 @@
close(fds[0]);
+ // Connect pipe to stdin and stdout.
+ dup2(fds[1], 0);
+ dup2(fds[1], 1);
+
+ // Make sure we don't hang on to open files which may get deleted but
+ // not have their disk space released until we exit. Close these
+ // before we try to get the lock because if one of them is open on
+ // the lock file then closing it after obtaining the lock would release
+ // the lock, which would be really bad.
+ for (int i = 2; i < lockfd; ++i) {
+ // Retry on EINTR; just ignore other errors (we'll get
+ // EBADF if the fd isn't open so that's OK).
+ while (close(i) < 0 && errno == EINTR) { }
+ }
+ closefrom(lockfd + 1);
+
reason why = SUCCESS;
{
@@ -160,5 +176,5 @@
// Tell the parent if we got the lock, and if not, why not.
char ch = static_cast<char>(why);
- while (write(fds[1], &ch, 1) < 0) {
+ while (write(1, &ch, 1) < 0) {
// EINTR means a signal interrupted us, so retry.
// Otherwise we're DOOMED! The best we can do is just exit
@@ -169,8 +185,4 @@
if (why != SUCCESS) _exit(0);
}
-
- // Connect pipe to stdin and stdout.
- dup2(fds[1], 0);
- dup2(fds[1], 1);
// Make sure we don't block unmount() of partition holding the current
@@ -184,13 +196,4 @@
// gives a warning even if we cast the result to void.
}
-
- // Make sure we don't hang on to open files which may get deleted but
- // not have their disk space released until we exit.
- for (int i = 2; i < lockfd; ++i) {
- // Retry on EINTR; just ignore other errors (we'll get
- // EBADF if the fd isn't open so that's OK).
- while (close(i) < 0 && errno == EINTR) { }
- }
- closefrom(lockfd + 1);
// FIXME: use special statically linked helper instead of cat.
Taken from 1.2 branch of upstream SVN r16915.
--- a/net/remoteconnection.cc (revision 16348)
+++ b/net/remoteconnection.cc (revision 16915)
@@ -618,5 +618,7 @@
int shift = 0;
do {
- if (i == buffer.end() || shift > 28) {
+ // Allow a full 64 bits for message lengths - anything longer than that
+ // is almost certainly a corrupt value.
+ if (i == buffer.end() || shift > 63) {
// Something is very wrong...
throw Xapian::NetworkError("Insane message length specified!");
Attachment:
signature.asc
Description: Digital signature