| 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 |