[DRE-commits] [ruby-mysql2] 02/02: add avoid_openssl_loop.patch and correct_mysql_init.patch for Jessie
Cédric Boutillier
boutil at moszumanska.debian.org
Wed Nov 26 23:11:26 UTC 2014
This is an automated email from the git hooks/post-receive script.
boutil pushed a commit to branch master
in repository ruby-mysql2.
commit bd14b16cdc47b0a880975c4268a52d5852d942a4
Author: Cédric Boutillier <boutil at debian.org>
Date: Thu Nov 27 00:04:57 2014 +0100
add avoid_openssl_loop.patch and correct_mysql_init.patch for Jessie
---
debian/changelog | 12 ++++++++
debian/patches/avoid_openssl_loop.patch | 49 +++++++++++++++++++++++++++++++++
debian/patches/correct_mysql_init.patch | 38 +++++++++++++++++++++++++
debian/patches/series | 2 ++
4 files changed, 101 insertions(+)
diff --git a/debian/changelog b/debian/changelog
index faff5c4..a2d2ac6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,15 @@
+ruby-mysql2 (0.3.16-2) unstable; urgency=medium
+
+ * Add upstream patch avoid_openssl_loop.patch to use /dev/null in the
+ invalidate_fd function to avoid infinite loop in OpenSSL (Closes: #770891)
+ Before, a dummy socket was used instead of /dev/null, which may not absorb
+ all writes and lead to an infinite loop.
+ * Add upstream patch correct_mysql_init.patch to correctly initialize the
+ MySQL library, to avoid race condition when other threads try to create a
+ connection (Closes: #770896)
+
+ -- Cédric Boutillier <boutil at debian.org> Tue, 25 Nov 2014 17:52:01 +0100
+
ruby-mysql2 (0.3.16-1) unstable; urgency=medium
[ Jérémy Bobbio ]
diff --git a/debian/patches/avoid_openssl_loop.patch b/debian/patches/avoid_openssl_loop.patch
new file mode 100644
index 0000000..ed72d67
--- /dev/null
+++ b/debian/patches/avoid_openssl_loop.patch
@@ -0,0 +1,49 @@
+Description: Use /dev/null in invalidate_fd to avoid infinite loop in OpenSSL
+ Thanks to Andy Bakun / @thwarted for identifying the issue and
+ suggesting the /dev/null workaround.
+Author: Aaron Stone <aaron at serendipity.cx>
+Origin: upstream,https://github.com/brianmario/mysql2/commit/fc30a7c056e63517f5f66702016941b3902ec0b6.patch
+Reviewed-by: Cédric Boutillier <boutil at debian.org>
+Last-Update: 2014-08-24
+
+--- a/ext/mysql2/client.c
++++ b/ext/mysql2/client.c
+@@ -167,26 +167,30 @@
+
+ #ifndef _WIN32
+ /*
+- * Redirect clientfd to a dummy socket for mysql_close to
+- * write, shutdown, and close on as a no-op.
+- * We do this hack because we want to call mysql_close to release
+- * memory, but do not want mysql_close to drop connections in the
+- * parent if the socket got shared in fork.
++ * Redirect clientfd to /dev/null for mysql_close and SSL_close to write,
++ * shutdown, and close. The hack is needed to prevent shutdown() from breaking
++ * a socket that may be in use by the parent or other processes after fork.
++ *
++ * /dev/null is used to absorb writes; previously a dummy socket was used, but
++ * it could not abosrb writes and caused openssl to go into an infinite loop.
++ *
+ * Returns Qtrue or Qfalse (success or failure)
++ *
++ * Note: if this function is needed on Windows, use "nul" instead of "/dev/null"
+ */
+ static VALUE invalidate_fd(int clientfd)
+ {
+ #ifdef SOCK_CLOEXEC
+ /* Atomically set CLOEXEC on the new FD in case another thread forks */
+- int sockfd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
++ int sockfd = open("/dev/null", O_RDWR | O_CLOEXEC);
+ if (sockfd < 0) {
+ /* Maybe SOCK_CLOEXEC is defined but not available on this kernel */
+- int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
++ int sockfd = open("/dev/null", O_RDWR);
+ fcntl(sockfd, F_SETFD, FD_CLOEXEC);
+ }
+ #else
+ /* Well we don't have SOCK_CLOEXEC, so just set FD_CLOEXEC quickly */
+- int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
++ int sockfd = open("/dev/null", O_RDWR);
+ fcntl(sockfd, F_SETFD, FD_CLOEXEC);
+ #endif
+
diff --git a/debian/patches/correct_mysql_init.patch b/debian/patches/correct_mysql_init.patch
new file mode 100644
index 0000000..fba113d
--- /dev/null
+++ b/debian/patches/correct_mysql_init.patch
@@ -0,0 +1,38 @@
+Description: Added call to mysql_library_init during initialization of the gem
+ This call must be performed before trying to call mysql_init from
+ multiple threads
+ Reference: http://dev.mysql.com/doc/refman/5.1/en/mysql-init.html
+ Minimal reproduction of the problem if mysql_library_init is not called
+
+ require 'mysql2'
+
+ def connect
+ Mysql2::Client.new()
+ end
+
+ threads = [0,1].map {
+ Thread.new { connect }
+ }
+ threads.map(&:join)
+ puts "OK!"
+Author: Michael Kruglos <michael at kruglos.com>
+Reviewed-by: Cédric Boutillier <boutil at debian.org>
+Origin: upstream,https://github.com/brianmario/mysql2/commit/de48627ee89b9dfd7d966f3ea747e95a48085792.patch
+Last-Update: 2014-07-30
+
+--- a/ext/mysql2/client.c
++++ b/ext/mysql2/client.c
+@@ -1237,6 +1237,13 @@
+ }
+ }
+
++ /* Initializing mysql library, so different threads could call Client.new */
++ /* without race condition in the library */
++ if (mysql_library_init(0, NULL, NULL) != 0) {
++ rb_raise(rb_eRuntimeError, "Could not initialize MySQL client library");
++ return;
++ }
++
+ #if 0
+ mMysql2 = rb_define_module("Mysql2"); Teach RDoc about Mysql2 constant.
+ #endif
diff --git a/debian/patches/series b/debian/patches/series
index 5eb2348..7893ddc 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,5 @@
remove_rpath_compilation_flag.patch
remove_rubygems_from_examples.patch
#deactivate_failing_specs.patch
+avoid_openssl_loop.patch
+correct_mysql_init.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-mysql2.git
More information about the Pkg-ruby-extras-commits
mailing list