blob: 48101ebfb77d1589ea0f0571e344317940536dbb [file] [log] [blame]
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