From e9f79718d75e1e2a9b1f5e11073f50b03617fed2 Mon Sep 17 00:00:00 2001 From: Mike Gilbert Date: Sat, 3 Oct 2015 14:56:15 -0400 Subject: [PATCH] net-p2p/transmission: Fix issue with encryption with libevent-2.1.5 Backported upstream patches. Bug: https://bugs.gentoo.org/536922 Package-Manager: portage-2.2.22_p5 --- .../files/2.84-libevent-2.1.5.patch | 112 ++++++++++++ .../transmission/transmission-2.84-r2.ebuild | 164 ++++++++++++++++++ 2 files changed, 276 insertions(+) create mode 100644 net-p2p/transmission/files/2.84-libevent-2.1.5.patch create mode 100644 net-p2p/transmission/transmission-2.84-r2.ebuild diff --git a/net-p2p/transmission/files/2.84-libevent-2.1.5.patch b/net-p2p/transmission/files/2.84-libevent-2.1.5.patch new file mode 100644 index 000000000000..48101ebfb77d --- /dev/null +++ b/net-p2p/transmission/files/2.84-libevent-2.1.5.patch @@ -0,0 +1,112 @@ +Fix runtime issues with libevent-2.1.5 + +Bug: https://bugs.gentoo.org/536922 +Index: libtransmission/peer-io.c +=================================================================== +--- libtransmission/peer-io.c (revision 14541) ++++ libtransmission/peer-io.c (revision 14545) +@@ -1041,6 +1041,33 @@ + *** + **/ + ++static inline void ++processBuffer (tr_crypto * crypto, ++ struct evbuffer * buffer, ++ size_t offset, ++ size_t size, ++ void (* callback) (tr_crypto *, size_t, const void *, void *)) ++{ ++ struct evbuffer_ptr pos; ++ struct evbuffer_iovec iovec; ++ ++ evbuffer_ptr_set (buffer, &pos, offset, EVBUFFER_PTR_SET); ++ ++ do ++ { ++ if (evbuffer_peek (buffer, size, &pos, &iovec, 1) <= 0) ++ break; ++ ++ callback (crypto, iovec.iov_len, iovec.iov_base, iovec.iov_base); ++ ++ assert (size >= iovec.iov_len); ++ size -= iovec.iov_len; ++ } ++ while (!evbuffer_ptr_set (buffer, &pos, iovec.iov_len, EVBUFFER_PTR_ADD)); ++ ++ assert (size == 0); ++} ++ + static void + addDatatype (tr_peerIo * io, size_t byteCount, bool isPieceData) + { +@@ -1051,19 +1078,14 @@ + peer_io_push_datatype (io, d); + } + +-static void +-maybeEncryptBuffer (tr_peerIo * io, struct evbuffer * buf) ++static inline void ++maybeEncryptBuffer (tr_peerIo * io, ++ struct evbuffer * buf, ++ size_t offset, ++ size_t size) + { + if (io->encryption_type == PEER_ENCRYPTION_RC4) +- { +- struct evbuffer_ptr pos; +- struct evbuffer_iovec iovec; +- evbuffer_ptr_set (buf, &pos, 0, EVBUFFER_PTR_SET); +- do { +- evbuffer_peek (buf, -1, &pos, &iovec, 1); +- tr_cryptoEncrypt (&io->crypto, iovec.iov_len, iovec.iov_base, iovec.iov_base); +- } while (!evbuffer_ptr_set (buf, &pos, iovec.iov_len, EVBUFFER_PTR_ADD)); +- } ++ processBuffer (&io->crypto, buf, offset, size, &tr_cryptoEncrypt); + } + + void +@@ -1070,7 +1092,7 @@ + tr_peerIoWriteBuf (tr_peerIo * io, struct evbuffer * buf, bool isPieceData) + { + const size_t byteCount = evbuffer_get_length (buf); +- maybeEncryptBuffer (io, buf); ++ maybeEncryptBuffer (io, buf, 0, byteCount); + evbuffer_add_buffer (io->outbuf, buf); + addDatatype (io, byteCount, isPieceData); + } +@@ -1126,6 +1148,16 @@ + **** + ***/ + ++static inline void ++maybeDecryptBuffer (tr_peerIo * io, ++ struct evbuffer * buf, ++ size_t offset, ++ size_t size) ++{ ++ if (io->encryption_type == PEER_ENCRYPTION_RC4) ++ processBuffer (&io->crypto, buf, offset, size, &tr_cryptoDecrypt); ++} ++ + void + tr_peerIoReadBytesToBuf (tr_peerIo * io, struct evbuffer * inbuf, struct evbuffer * outbuf, size_t byteCount) + { +@@ -1141,17 +1173,7 @@ + evbuffer_add_buffer (outbuf, tmp); + evbuffer_free (tmp); + +- /* decrypt if needed */ +- if (io->encryption_type == PEER_ENCRYPTION_RC4) { +- struct evbuffer_ptr pos; +- struct evbuffer_iovec iovec; +- evbuffer_ptr_set (outbuf, &pos, old_length, EVBUFFER_PTR_SET); +- do { +- evbuffer_peek (outbuf, byteCount, &pos, &iovec, 1); +- tr_cryptoDecrypt (&io->crypto, iovec.iov_len, iovec.iov_base, iovec.iov_base); +- byteCount -= iovec.iov_len; +- } while (!evbuffer_ptr_set (outbuf, &pos, iovec.iov_len, EVBUFFER_PTR_ADD)); +- } ++ maybeDecryptBuffer (io, outbuf, old_length, byteCount); + } + + void diff --git a/net-p2p/transmission/transmission-2.84-r2.ebuild b/net-p2p/transmission/transmission-2.84-r2.ebuild new file mode 100644 index 000000000000..49e1f803c60c --- /dev/null +++ b/net-p2p/transmission/transmission-2.84-r2.ebuild @@ -0,0 +1,164 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +EAPI=5 +inherit autotools eutils fdo-mime gnome2-utils qmake-utils systemd user + +DESCRIPTION="A Fast, Easy and Free BitTorrent client" +HOMEPAGE="http://www.transmissionbt.com/" +SRC_URI="http://download.transmissionbt.com/${PN}/files/${P}.tar.xz" + +# web/LICENSE is always GPL-2 whereas COPYING allows either GPL-2 or GPL-3 for the rest +# transmission in licenses/ is for mentioning OpenSSL linking exception +# MIT is in several libtransmission/ headers +LICENSE="|| ( GPL-2 GPL-3 Transmission-OpenSSL-exception ) GPL-2 MIT" +SLOT=0 +IUSE="ayatana gtk lightweight systemd qt4 qt5 xfs" +KEYWORDS="~amd64 ~arm ~mips ~ppc ~ppc64 ~x86 ~x86-fbsd ~amd64-linux" + +RDEPEND=">=dev-libs/libevent-2.0.10:= + dev-libs/openssl:0= + net-libs/libnatpmp:= + >=net-libs/miniupnpc-1.7:= + >=net-misc/curl-7.16.3:=[ssl] + sys-libs/zlib:= + gtk? ( + >=dev-libs/dbus-glib-0.100:= + >=dev-libs/glib-2.32:2= + >=x11-libs/gtk+-3.4:3= + ayatana? ( >=dev-libs/libappindicator-0.4.90:3= ) + ) + systemd? ( sys-apps/systemd:= ) + qt4? ( + dev-qt/qtcore:4= + dev-qt/qtgui:4= + dev-qt/qtdbus:4= + ) + qt5? ( + dev-qt/qtcore:5= + dev-qt/qtdbus:5= + dev-qt/qtgui:5= + dev-qt/qtnetwork:5= + dev-qt/qtwidgets:5= + )" +DEPEND="${RDEPEND} + >=dev-libs/glib-2.32 + dev-util/intltool + sys-devel/gettext + virtual/os-headers + virtual/pkgconfig + xfs? ( sys-fs/xfsprogs )" + +REQUIRED_USE="ayatana? ( gtk ) ?? ( qt4 qt5 )" + +DOCS="AUTHORS NEWS qt/README.txt" + +pkg_setup() { + enewgroup ${PN} + enewuser ${PN} -1 -1 -1 ${PN} +} + +src_prepare() { + sed -i -e '/CFLAGS/s:-ggdb3::' configure.ac || die + # Trick to avoid automagic dependency + use ayatana || { sed -i -e '/^LIBAPPINDICATOR_MINIMUM/s:=.*:=9999:' configure.ac || die; } + # Pass our configuration dir to systemd unit file + sed -i '/ExecStart/ s|$| -g /var/lib/transmission/config|' daemon/${PN}-daemon.service || die + # http://trac.transmissionbt.com/ticket/4324 + sed -i -e 's|noinst\(_PROGRAMS = $(TESTS)\)|check\1|' lib${PN}/Makefile.am || die + # Fix for broken translations path + epatch "${FILESDIR}"/${PN}-2.80-translations-path-fix.patch + # http://trac.transmissionbt.com/ticket/5700 + sed -i -e '1iQMAKE_CXXFLAGS += -std=c++11' qt/qtr.pro || die + + epatch "${FILESDIR}/2.84-miniupnp14.patch" + epatch "${FILESDIR}/2.84-libevent-2.1.5.patch" + + epatch_user + eautoreconf +} + +src_configure() { + export ac_cv_header_xfs_xfs_h=$(usex xfs) + + econf \ + --enable-external-natpmp \ + $(use_enable lightweight) \ + $(use_with systemd systemd-daemon) \ + $(use_with gtk) + + if use qt4 || use qt5; then + pushd qt >/dev/null || die + use qt4 && eqmake4 qtr.pro + use qt5 && eqmake5 qtr.pro + popd >/dev/null || die + fi +} + +src_compile() { + emake + + if use qt4 || use qt5; then + use qt4 && local -x QT_SELECT=4 + use qt5 && local -x QT_SELECT=5 + emake -C qt + lrelease qt/translations/*.ts || die + fi +} + +src_install() { + default + + rm -f "${ED}"/usr/share/${PN}/web/LICENSE + + newinitd "${FILESDIR}"/${PN}-daemon.initd.9 ${PN}-daemon + newconfd "${FILESDIR}"/${PN}-daemon.confd.4 ${PN}-daemon + systemd_dounit daemon/${PN}-daemon.service + + keepdir /var/{lib/${PN}/{config,downloads},log/${PN}} + fowners -R ${PN}:${PN} /var/{lib/${PN}/{,config,downloads},log/${PN}} + + if use qt4 || use qt5; then + pushd qt >/dev/null || die + emake INSTALL_ROOT="${ED}"/usr install + + domenu ${PN}-qt.desktop + + local res + for res in 16 22 24 32 48 64 72 96 128 192 256; do + doicon -s ${res} icons/hicolor/${res}x${res}/${PN}-qt.png + done + doicon -s scalable icons/hicolor/scalable/${PN}-qt.svg + + use qt4 && insinto /usr/share/qt4/translations + use qt5 && insinto /usr/share/qt5/translations + doins translations/*.qm + popd >/dev/null || die + fi +} + +pkg_preinst() { + gnome2_icon_savelist +} + +pkg_postinst() { + fdo-mime_desktop_database_update + gnome2_icon_cache_update + + elog "If you use ${PN}-daemon, please, set 'rpc-username' and" + elog "'rpc-password' (in plain text, ${PN}-daemon will hash it on" + elog "start) in settings.json file located at /var/lib/${PN}/config or" + elog "any other appropriate config directory." + elog + elog "Since µTP is enabled by default, ${PN} needs large kernel buffers for" + elog "the UDP socket. You can append following lines into /etc/sysctl.conf:" + elog " net.core.rmem_max = 4194304" + elog " net.core.wmem_max = 1048576" + elog "and run sysctl -p" +} + +pkg_postrm() { + fdo-mime_desktop_database_update + gnome2_icon_cache_update +} -- 2.26.2