From a7237c69f7befce7af174087bf770acd0187fb9b Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 15 May 2016 23:40:09 +0900 Subject: [PATCH 1/7] Refactor BitTorrent message buffer usage --- src/BtBitfieldMessage.cc | 9 ++-- src/BtBitfieldMessage.h | 2 +- src/BtExtendedMessage.cc | 12 +++-- src/BtExtendedMessage.h | 2 +- src/BtHandshakeMessage.cc | 6 +-- src/BtHandshakeMessage.h | 2 +- src/BtKeepAliveMessage.cc | 6 +-- src/BtKeepAliveMessage.h | 2 +- src/BtPieceMessage.cc | 11 ++-- src/BtPortMessage.cc | 6 +-- src/BtPortMessage.h | 2 +- src/IndexBtMessage.cc | 6 +-- src/IndexBtMessage.h | 2 +- src/MSEHandshake.cc | 84 ++++++++++++++---------------- src/MSEHandshake.h | 15 +++--- src/PeerConnection.cc | 6 +-- src/PeerConnection.h | 2 +- src/RangeBtMessage.cc | 6 +-- src/RangeBtMessage.h | 2 +- src/SimpleBtMessage.cc | 6 +-- src/SimpleBtMessage.h | 4 +- src/SocketBuffer.cc | 25 +++++---- src/SocketBuffer.h | 12 ++--- src/ZeroBtMessage.cc | 6 +-- src/ZeroBtMessage.h | 2 +- test/BtAllowedFastMessageTest.cc | 6 +-- test/BtBitfieldMessageTest.cc | 6 +-- test/BtCancelMessageTest.cc | 6 +-- test/BtChokeMessageTest.cc | 6 +-- test/BtExtendedMessageTest.cc | 6 +-- test/BtHandshakeMessageTest.cc | 20 +++---- test/BtHaveAllMessageTest.cc | 6 +-- test/BtHaveMessageTest.cc | 6 +-- test/BtHaveNoneMessageTest.cc | 6 +-- test/BtInterestedMessageTest.cc | 6 +-- test/BtKeepAliveMessageTest.cc | 6 +-- test/BtNotInterestedMessageTest.cc | 6 +-- test/BtPortMessageTest.cc | 6 +-- test/BtRejectMessageTest.cc | 6 +-- test/BtRequestMessageTest.cc | 6 +-- test/BtSuggestPieceMessageTest.cc | 6 +-- test/BtUnchokeMessageTest.cc | 6 +-- 42 files changed, 176 insertions(+), 178 deletions(-) diff --git a/src/BtBitfieldMessage.cc b/src/BtBitfieldMessage.cc index 9d55d304..64418a0c 100644 --- a/src/BtBitfieldMessage.cc +++ b/src/BtBitfieldMessage.cc @@ -97,7 +97,7 @@ void BtBitfieldMessage::doReceivedAction() } } -unsigned char* BtBitfieldMessage::createMessage() +std::vector BtBitfieldMessage::createMessage() { /** * len --- 1+bitfieldLength, 4bytes @@ -106,9 +106,10 @@ unsigned char* BtBitfieldMessage::createMessage() * total: 5+bitfieldLength bytes */ const size_t msgLength = 5 + bitfieldLength_; - auto msg = new unsigned char[msgLength]; - bittorrent::createPeerMessageString(msg, msgLength, 1 + bitfieldLength_, ID); - memcpy(msg + 5, bitfield_.get(), bitfieldLength_); + auto msg = std::vector(msgLength); + bittorrent::createPeerMessageString(msg.data(), msgLength, + 1 + bitfieldLength_, ID); + memcpy(msg.data() + 5, bitfield_.get(), bitfieldLength_); return msg; } diff --git a/src/BtBitfieldMessage.h b/src/BtBitfieldMessage.h index 640bf6ff..195b1d1e 100644 --- a/src/BtBitfieldMessage.h +++ b/src/BtBitfieldMessage.h @@ -66,7 +66,7 @@ public: virtual void doReceivedAction() CXX11_OVERRIDE; - virtual unsigned char* createMessage() CXX11_OVERRIDE; + virtual std::vector createMessage() CXX11_OVERRIDE; virtual size_t getMessageLength() CXX11_OVERRIDE; diff --git a/src/BtExtendedMessage.cc b/src/BtExtendedMessage.cc index add69170..10517b3b 100644 --- a/src/BtExtendedMessage.cc +++ b/src/BtExtendedMessage.cc @@ -58,7 +58,7 @@ BtExtendedMessage::BtExtendedMessage( { } -unsigned char* BtExtendedMessage::createMessage() +std::vector BtExtendedMessage::createMessage() { /** * len --- 2+extpayload.length, 4bytes @@ -69,10 +69,12 @@ unsigned char* BtExtendedMessage::createMessage() */ std::string payload = extensionMessage_->getPayload(); msgLength_ = 6 + payload.size(); - auto msg = new unsigned char[msgLength_]; - bittorrent::createPeerMessageString(msg, msgLength_, 2 + payload.size(), ID); - *(msg + 5) = extensionMessage_->getExtensionMessageID(); - memcpy(msg + 6, payload.data(), payload.size()); + auto msg = std::vector(msgLength_); + auto p = msg.data(); + bittorrent::createPeerMessageString(p, msgLength_, 2 + payload.size(), ID); + p += 5; + *p++ = extensionMessage_->getExtensionMessageID(); + std::copy(std::begin(payload), std::end(payload), p); return msg; } diff --git a/src/BtExtendedMessage.h b/src/BtExtendedMessage.h index dcd0d198..c22824d1 100644 --- a/src/BtExtendedMessage.h +++ b/src/BtExtendedMessage.h @@ -61,7 +61,7 @@ public: virtual void doReceivedAction() CXX11_OVERRIDE; - virtual unsigned char* createMessage() CXX11_OVERRIDE; + virtual std::vector createMessage() CXX11_OVERRIDE; virtual size_t getMessageLength() CXX11_OVERRIDE; diff --git a/src/BtHandshakeMessage.cc b/src/BtHandshakeMessage.cc index 95f99e0d..7f322f57 100644 --- a/src/BtHandshakeMessage.cc +++ b/src/BtHandshakeMessage.cc @@ -81,10 +81,10 @@ BtHandshakeMessage::create(const unsigned char* data, size_t dataLength) return msg; } -unsigned char* BtHandshakeMessage::createMessage() +std::vector BtHandshakeMessage::createMessage() { - auto msg = new unsigned char[MESSAGE_LENGTH]; - auto dst = msg; + auto msg = std::vector(MESSAGE_LENGTH); + auto dst = msg.data(); *dst++ = pstrlen_; dst = std::copy(std::begin(pstr_), std::end(pstr_), dst); dst = std::copy(std::begin(reserved_), std::end(reserved_), dst); diff --git a/src/BtHandshakeMessage.h b/src/BtHandshakeMessage.h index 5bbb0b4f..b1a55ad2 100644 --- a/src/BtHandshakeMessage.h +++ b/src/BtHandshakeMessage.h @@ -79,7 +79,7 @@ public: virtual void doReceivedAction() CXX11_OVERRIDE{}; - virtual unsigned char* createMessage() CXX11_OVERRIDE; + virtual std::vector createMessage() CXX11_OVERRIDE; virtual size_t getMessageLength() CXX11_OVERRIDE; diff --git a/src/BtKeepAliveMessage.cc b/src/BtKeepAliveMessage.cc index c9fe7937..bf656e46 100644 --- a/src/BtKeepAliveMessage.cc +++ b/src/BtKeepAliveMessage.cc @@ -39,15 +39,13 @@ namespace aria2 { const char BtKeepAliveMessage::NAME[] = "keep alive"; -unsigned char* BtKeepAliveMessage::createMessage() +std::vector BtKeepAliveMessage::createMessage() { /** * len --- 0, 4bytes * total: 4bytes */ - auto msg = new unsigned char[MESSAGE_LENGTH]; - memset(msg, 0, MESSAGE_LENGTH); - return msg; + return std::vector(MESSAGE_LENGTH); } size_t BtKeepAliveMessage::getMessageLength() { return MESSAGE_LENGTH; } diff --git a/src/BtKeepAliveMessage.h b/src/BtKeepAliveMessage.h index 23c0e73a..9312b48c 100644 --- a/src/BtKeepAliveMessage.h +++ b/src/BtKeepAliveMessage.h @@ -52,7 +52,7 @@ public: virtual void doReceivedAction() CXX11_OVERRIDE {} - virtual unsigned char* createMessage() CXX11_OVERRIDE; + virtual std::vector createMessage() CXX11_OVERRIDE; virtual size_t getMessageLength() CXX11_OVERRIDE; diff --git a/src/BtPieceMessage.cc b/src/BtPieceMessage.cc index 354f97d5..1c67f2ec 100644 --- a/src/BtPieceMessage.cc +++ b/src/BtPieceMessage.cc @@ -213,17 +213,16 @@ void BtPieceMessage::send() void BtPieceMessage::pushPieceData(int64_t offset, int32_t length) const { assert(length <= static_cast(16_k)); - auto buf = make_unique(length + MESSAGE_HEADER_LENGTH); - createMessageHeader(buf.get()); + auto buf = std::vector(length + MESSAGE_HEADER_LENGTH); + createMessageHeader(buf.data()); ssize_t r; r = getPieceStorage()->getDiskAdaptor()->readData( - buf.get() + MESSAGE_HEADER_LENGTH, length, offset); + buf.data() + MESSAGE_HEADER_LENGTH, length, offset); if (r == length) { const auto& peer = getPeer(); getPeerConnection()->pushBytes( - buf.release(), length + MESSAGE_HEADER_LENGTH, - make_unique(downloadContext_, peer, - MESSAGE_HEADER_LENGTH)); + std::move(buf), make_unique(downloadContext_, peer, + MESSAGE_HEADER_LENGTH)); peer->updateUploadSpeed(length); downloadContext_->updateUploadSpeed(length); } diff --git a/src/BtPortMessage.cc b/src/BtPortMessage.cc index 99b0d699..4bc1d957 100644 --- a/src/BtPortMessage.cc +++ b/src/BtPortMessage.cc @@ -100,7 +100,7 @@ void BtPortMessage::doReceivedAction() } } -unsigned char* BtPortMessage::createMessage() +std::vector BtPortMessage::createMessage() { /** * len --- 5, 4bytes @@ -108,8 +108,8 @@ unsigned char* BtPortMessage::createMessage() * port --- port number, 2bytes * total: 7bytes */ - auto msg = new unsigned char[MESSAGE_LENGTH]; - bittorrent::createPeerMessageString(msg, MESSAGE_LENGTH, 3, ID); + auto msg = std::vector(MESSAGE_LENGTH); + bittorrent::createPeerMessageString(msg.data(), MESSAGE_LENGTH, 3, ID); bittorrent::setShortIntParam(&msg[5], port_); return msg; } diff --git a/src/BtPortMessage.h b/src/BtPortMessage.h index 453d74cb..ede01c00 100644 --- a/src/BtPortMessage.h +++ b/src/BtPortMessage.h @@ -71,7 +71,7 @@ public: virtual void doReceivedAction() CXX11_OVERRIDE; - virtual unsigned char* createMessage() CXX11_OVERRIDE; + virtual std::vector createMessage() CXX11_OVERRIDE; virtual size_t getMessageLength() CXX11_OVERRIDE; diff --git a/src/IndexBtMessage.cc b/src/IndexBtMessage.cc index b6f58dc1..f71d361d 100644 --- a/src/IndexBtMessage.cc +++ b/src/IndexBtMessage.cc @@ -39,7 +39,7 @@ namespace aria2 { -unsigned char* IndexBtMessage::createMessage() +std::vector IndexBtMessage::createMessage() { /** * len --- 5, 4bytes @@ -47,8 +47,8 @@ unsigned char* IndexBtMessage::createMessage() * piece index --- index, 4bytes * total: 9bytes */ - auto msg = new unsigned char[MESSAGE_LENGTH]; - bittorrent::createPeerMessageString(msg, MESSAGE_LENGTH, 5, getId()); + auto msg = std::vector(MESSAGE_LENGTH); + bittorrent::createPeerMessageString(msg.data(), MESSAGE_LENGTH, 5, getId()); bittorrent::setIntParam(&msg[5], index_); return msg; } diff --git a/src/IndexBtMessage.h b/src/IndexBtMessage.h index 73ef1268..76f44bac 100644 --- a/src/IndexBtMessage.h +++ b/src/IndexBtMessage.h @@ -65,7 +65,7 @@ public: size_t getIndex() const { return index_; } - virtual unsigned char* createMessage() CXX11_OVERRIDE; + virtual std::vector createMessage() CXX11_OVERRIDE; virtual size_t getMessageLength() CXX11_OVERRIDE; diff --git a/src/MSEHandshake.cc b/src/MSEHandshake.cc index dba0f176..cd33faac 100644 --- a/src/MSEHandshake.cc +++ b/src/MSEHandshake.cc @@ -64,7 +64,7 @@ namespace { const size_t MAX_PAD_LENGTH = 512; const size_t CRYPTO_BITFIELD_LENGTH = 4; -const unsigned char VC[] = {0, 0, 0, 0, 0, 0, 0, 0}; +constexpr auto VC = std::array{}; const unsigned char* PRIME = reinterpret_cast( "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B" @@ -123,13 +123,15 @@ void MSEHandshake::initEncryptionFacility(bool initiator) void MSEHandshake::sendPublicKey() { A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Sending public key.", cuid_)); - auto buf = make_unique(KEY_LENGTH + MAX_PAD_LENGTH); - dh_->getPublicKey(buf.get(), KEY_LENGTH); + auto buf = std::vector(KEY_LENGTH + MAX_PAD_LENGTH); + dh_->getPublicKey(buf.data(), KEY_LENGTH); size_t padLength = SimpleRandomizer::getInstance()->getRandomNumber(MAX_PAD_LENGTH + 1); - dh_->generateNonce(buf.get() + KEY_LENGTH, padLength); - socketBuffer_.pushBytes(buf.release(), KEY_LENGTH + padLength); + dh_->generateNonce(buf.data() + KEY_LENGTH, padLength); + buf.resize(KEY_LENGTH + padLength); + + socketBuffer_.pushBytes(std::move(buf)); } void MSEHandshake::read() @@ -209,16 +211,16 @@ void MSEHandshake::initCipher(const unsigned char* infoHash) enc.init(peerCipherKey, sizeof(peerCipherKey)); // discard first 1024 bytes ARC4 output. enc.encrypt(garbage.size(), garbage.data(), garbage.data()); - enc.encrypt(VC_LENGTH, initiatorVCMarker_, VC); + enc.encrypt(VC_LENGTH, initiatorVCMarker_, VC.data()); } } // Given data is pushed to socketBuffer_ and data will be deleted by // socketBuffer_. -void MSEHandshake::encryptAndSendData(unsigned char* data, size_t length) +void MSEHandshake::encryptAndSendData(std::vector data) { - encryptor_->encrypt(length, data, data); - socketBuffer_.pushBytes(data, length); + encryptor_->encrypt(data.size(), data.data(), data.data()); + socketBuffer_.pushBytes(std::move(data)); } void MSEHandshake::createReq1Hash(unsigned char* md) const @@ -264,27 +266,25 @@ void MSEHandshake::sendInitiatorStep2() { A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Sending negotiation step2.", cuid_)); // Assuming no exception - auto md = make_unique((size_t)20); - createReq1Hash(md.get()); - socketBuffer_.pushBytes(md.release(), 20); + auto md = std::vector(20); + createReq1Hash(md.data()); + socketBuffer_.pushBytes(std::move(md)); // Assuming no exception - md = make_unique((size_t)20); - createReq23Hash(md.get(), infoHash_); - socketBuffer_.pushBytes(md.release(), 20); + md = std::vector(20); + createReq23Hash(md.data(), infoHash_); + socketBuffer_.pushBytes(std::move(md)); // buffer is filled in this order: // VC(VC_LENGTH bytes), // crypto_provide(CRYPTO_BITFIELD_LENGTH bytes), // len(padC)(2 bytes), // padC(len(padC) bytes <= MAX_PAD_LENGTH), // len(IA)(2 bytes) - auto buffer = make_unique( - 40 + VC_LENGTH + CRYPTO_BITFIELD_LENGTH + 2 + MAX_PAD_LENGTH + 2); - unsigned char* ptr = buffer.get(); + auto buffer = std::vector(VC_LENGTH + CRYPTO_BITFIELD_LENGTH + + 2 + MAX_PAD_LENGTH + 2); + auto ptr = std::begin(buffer); // VC - memcpy(ptr, VC, sizeof(VC)); - ptr += sizeof(VC); + ptr += VC_LENGTH; // crypto_provide - memset(ptr, 0, CRYPTO_BITFIELD_LENGTH); if (!option_->getAsBool(PREF_BT_FORCE_ENCRYPTION) && option_->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) { ptr[3] = CRYPTO_PLAIN_TEXT; @@ -294,24 +294,21 @@ void MSEHandshake::sendInitiatorStep2() // len(padC) uint16_t padCLength = SimpleRandomizer::getInstance()->getRandomNumber(MAX_PAD_LENGTH + 1); - { - uint16_t padCLengthBE = htons(padCLength); - memcpy(ptr, &padCLengthBE, sizeof(padCLengthBE)); - } - ptr += 2; + uint16_t padCLengthBE = htons(padCLength); + ptr = std::copy_n(reinterpret_cast(&padCLengthBE), + sizeof(padCLengthBE), ptr); // padC - memset(ptr, 0, padCLength); ptr += padCLength; // len(IA) // currently, IA is zero-length. uint16_t iaLength = 0; { uint16_t iaLengthBE = htons(iaLength); - memcpy(ptr, &iaLengthBE, sizeof(iaLengthBE)); + ptr = std::copy_n(reinterpret_cast(&iaLengthBE), + sizeof(iaLengthBE), ptr); } - ptr += 2; - size_t buflen = ptr - buffer.get(); - encryptAndSendData(buffer.release(), buflen); + buffer.erase(ptr, std::end(buffer)); + encryptAndSendData(std::move(buffer)); } // This function reads exactly until the end of VC marker is reached. @@ -494,8 +491,8 @@ bool MSEHandshake::receiveReceiverIA() wantRead_ = true; return false; } - ia_ = make_unique(iaLength_); - decryptor_->encrypt(iaLength_, ia_.get(), rbuf_); + ia_ = std::vector(iaLength_); + decryptor_->encrypt(iaLength_, ia_.data(), rbuf_); A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - IA received.", cuid_)); // shift rbuf_ shiftBuffer(iaLength_); @@ -509,27 +506,24 @@ void MSEHandshake::sendReceiverStep2() // cryptoSelect(CRYPTO_BITFIELD_LENGTH bytes), // len(padD)(2bytes), // padD(len(padD)bytes <= MAX_PAD_LENGTH) - auto buffer = make_unique( - VC_LENGTH + CRYPTO_BITFIELD_LENGTH + 2 + MAX_PAD_LENGTH); - unsigned char* ptr = buffer.get(); + auto buffer = std::vector(VC_LENGTH + CRYPTO_BITFIELD_LENGTH + + 2 + MAX_PAD_LENGTH); + auto ptr = std::begin(buffer); // VC - memcpy(ptr, VC, sizeof(VC)); - ptr += sizeof(VC); + ptr += VC_LENGTH; // crypto_select - memset(ptr, 0, CRYPTO_BITFIELD_LENGTH); ptr[3] = negotiatedCryptoType_; ptr += CRYPTO_BITFIELD_LENGTH; // len(padD) uint16_t padDLength = SimpleRandomizer::getInstance()->getRandomNumber(MAX_PAD_LENGTH + 1); uint16_t padDLengthBE = htons(padDLength); - memcpy(ptr, &padDLengthBE, sizeof(padDLengthBE)); - ptr += sizeof(padDLengthBE); + ptr = std::copy_n(reinterpret_cast(&padDLengthBE), + sizeof(padDLengthBE), ptr); // padD, all zeroed - memset(ptr, 0, padDLength); ptr += padDLength; - size_t buflen = ptr - buffer.get(); - encryptAndSendData(buffer.release(), buflen); + buffer.erase(ptr, std::end(buffer)); + encryptAndSendData(std::move(buffer)); } uint16_t MSEHandshake::verifyPadLength(const unsigned char* padlenbuf, @@ -549,7 +543,7 @@ void MSEHandshake::verifyVC(unsigned char* vcbuf) { A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Verifying VC.", cuid_)); decryptor_->encrypt(VC_LENGTH, vcbuf, vcbuf); - if (memcmp(VC, vcbuf, VC_LENGTH) != 0) { + if (!std::equal(std::begin(VC), std::end(VC), vcbuf)) { throw DL_ABORT_EX( fmt("Invalid VC: %s", util::toHex(vcbuf, VC_LENGTH).c_str())); } diff --git a/src/MSEHandshake.h b/src/MSEHandshake.h index 69ad1dba..0b5da06d 100644 --- a/src/MSEHandshake.h +++ b/src/MSEHandshake.h @@ -67,14 +67,15 @@ public: CRYPTO_ARC4 = 0x02u }; + static constexpr size_t VC_LENGTH = 8U; + private: - static const size_t PRIME_BITS = 768U; - static const size_t KEY_LENGTH = (PRIME_BITS + 7U) / 8U; - static const size_t VC_LENGTH = 8U; + static constexpr size_t PRIME_BITS = 768U; + static constexpr size_t KEY_LENGTH = (PRIME_BITS + 7U) / 8U; // The largest buffering occurs when receiver receives step2 // handshake. We believe that IA is less than or equal to // BtHandshakeMessage::MESSAGE_LENGTH - static const size_t MAX_BUFFER_LENGTH = 636U; + static constexpr size_t MAX_BUFFER_LENGTH = 636U; cuid_t cuid_; std::shared_ptr socket_; @@ -97,10 +98,10 @@ private: size_t markerIndex_; uint16_t padLength_; uint16_t iaLength_; - std::unique_ptr ia_; + std::vector ia_; std::unique_ptr sha1_; - void encryptAndSendData(unsigned char* data, size_t length); + void encryptAndSendData(std::vector data); void createReq1Hash(unsigned char* md) const; @@ -171,7 +172,7 @@ public: void sendReceiverStep2(); // returns plain text IA - const unsigned char* getIA() const { return ia_.get(); } + const unsigned char* getIA() const { return ia_.data(); } size_t getIALength() const { return iaLength_; } diff --git a/src/PeerConnection.cc b/src/PeerConnection.cc index fac03921..56da81a2 100644 --- a/src/PeerConnection.cc +++ b/src/PeerConnection.cc @@ -83,13 +83,13 @@ PeerConnection::PeerConnection(cuid_t cuid, const std::shared_ptr& peer, PeerConnection::~PeerConnection() {} -void PeerConnection::pushBytes(unsigned char* data, size_t len, +void PeerConnection::pushBytes(std::vector data, std::unique_ptr progressUpdate) { if (encryptionEnabled_) { - encryptor_->encrypt(len, data, data); + encryptor_->encrypt(data.size(), data.data(), data.data()); } - socketBuffer_.pushBytes(data, len, std::move(progressUpdate)); + socketBuffer_.pushBytes(std::move(data), std::move(progressUpdate)); } bool PeerConnection::receiveMessage(unsigned char* data, size_t& dataLength) diff --git a/src/PeerConnection.h b/src/PeerConnection.h index 6571fe65..0779301a 100644 --- a/src/PeerConnection.h +++ b/src/PeerConnection.h @@ -95,7 +95,7 @@ public: // Pushes data into send buffer. After this call, this object gets // ownership of data, so caller must not delete or alter it. - void pushBytes(unsigned char* data, size_t len, + void pushBytes(std::vector data, std::unique_ptr progressUpdate = std::unique_ptr{}); diff --git a/src/RangeBtMessage.cc b/src/RangeBtMessage.cc index 5cf3940c..2f811ce7 100644 --- a/src/RangeBtMessage.cc +++ b/src/RangeBtMessage.cc @@ -45,7 +45,7 @@ RangeBtMessage::RangeBtMessage(uint8_t id, const char* name, size_t index, { } -unsigned char* RangeBtMessage::createMessage() +std::vector RangeBtMessage::createMessage() { /** * len --- 13, 4bytes @@ -55,8 +55,8 @@ unsigned char* RangeBtMessage::createMessage() * length -- length, 4bytes * total: 17bytes */ - auto msg = new unsigned char[MESSAGE_LENGTH]; - bittorrent::createPeerMessageString(msg, MESSAGE_LENGTH, 13, getId()); + auto msg = std::vector(MESSAGE_LENGTH); + bittorrent::createPeerMessageString(msg.data(), MESSAGE_LENGTH, 13, getId()); bittorrent::setIntParam(&msg[5], index_); bittorrent::setIntParam(&msg[9], begin_); bittorrent::setIntParam(&msg[13], length_); diff --git a/src/RangeBtMessage.h b/src/RangeBtMessage.h index c2a0d1d0..11fd8aa9 100644 --- a/src/RangeBtMessage.h +++ b/src/RangeBtMessage.h @@ -75,7 +75,7 @@ public: void setLength(int32_t length) { length_ = length; } - virtual unsigned char* createMessage() CXX11_OVERRIDE; + virtual std::vector createMessage() CXX11_OVERRIDE; virtual size_t getMessageLength() CXX11_OVERRIDE; diff --git a/src/SimpleBtMessage.cc b/src/SimpleBtMessage.cc index cf93b19a..57bc5aa2 100644 --- a/src/SimpleBtMessage.cc +++ b/src/SimpleBtMessage.cc @@ -56,11 +56,11 @@ void SimpleBtMessage::send() A2_LOG_INFO(fmt(MSG_SEND_PEER_MESSAGE, getCuid(), getPeer()->getIPAddress().c_str(), getPeer()->getPort(), toString().c_str())); - unsigned char* msg = createMessage(); + auto msg = createMessage(); size_t msgLength = getMessageLength(); A2_LOG_DEBUG( - fmt("msglength = %lu bytes", static_cast(msgLength))); - getPeerConnection()->pushBytes(msg, msgLength, getProgressUpdate()); + fmt("msglength = %lu bytes", static_cast(msg.size()))); + getPeerConnection()->pushBytes(std::move(msg), getProgressUpdate()); } std::unique_ptr SimpleBtMessage::getProgressUpdate() diff --git a/src/SimpleBtMessage.h b/src/SimpleBtMessage.h index bfeaa43b..c1398149 100644 --- a/src/SimpleBtMessage.h +++ b/src/SimpleBtMessage.h @@ -37,6 +37,8 @@ #include "AbstractBtMessage.h" +#include + namespace aria2 { struct ProgressUpdate; @@ -47,7 +49,7 @@ public: virtual void send() CXX11_OVERRIDE; - virtual unsigned char* createMessage() = 0; + virtual std::vector createMessage() = 0; virtual size_t getMessageLength() = 0; diff --git a/src/SocketBuffer.cc b/src/SocketBuffer.cc index 9b3c6f22..95a0244a 100644 --- a/src/SocketBuffer.cc +++ b/src/SocketBuffer.cc @@ -47,31 +47,34 @@ namespace aria2 { SocketBuffer::ByteArrayBufEntry::ByteArrayBufEntry( - unsigned char* bytes, size_t length, + std::vector bytes, std::unique_ptr progressUpdate) - : BufEntry(std::move(progressUpdate)), bytes_(bytes), length_(length) + : BufEntry(std::move(progressUpdate)), bytes_(std::move(bytes)) { } -SocketBuffer::ByteArrayBufEntry::~ByteArrayBufEntry() { delete[] bytes_; } +SocketBuffer::ByteArrayBufEntry::~ByteArrayBufEntry() {} ssize_t SocketBuffer::ByteArrayBufEntry::send(const std::shared_ptr& socket, size_t offset) { - return socket->writeData(bytes_ + offset, length_ - offset); + return socket->writeData(bytes_.data() + offset, bytes_.size() - offset); } bool SocketBuffer::ByteArrayBufEntry::final(size_t offset) const { - return length_ <= offset; + return bytes_.size() <= offset; } -size_t SocketBuffer::ByteArrayBufEntry::getLength() const { return length_; } +size_t SocketBuffer::ByteArrayBufEntry::getLength() const +{ + return bytes_.size(); +} const unsigned char* SocketBuffer::ByteArrayBufEntry::getData() const { - return bytes_; + return bytes_.data(); } SocketBuffer::StringBufEntry::StringBufEntry( @@ -106,12 +109,12 @@ SocketBuffer::SocketBuffer(std::shared_ptr socket) SocketBuffer::~SocketBuffer() {} -void SocketBuffer::pushBytes(unsigned char* bytes, size_t len, +void SocketBuffer::pushBytes(std::vector bytes, std::unique_ptr progressUpdate) { - if (len > 0) { - bufq_.push_back( - make_unique(bytes, len, std::move(progressUpdate))); + if (!bytes.empty()) { + bufq_.push_back(make_unique(std::move(bytes), + std::move(progressUpdate))); } } diff --git a/src/SocketBuffer.h b/src/SocketBuffer.h index 8d9f3198..5858078f 100644 --- a/src/SocketBuffer.h +++ b/src/SocketBuffer.h @@ -40,6 +40,7 @@ #include #include #include +#include namespace aria2 { @@ -77,7 +78,7 @@ private: class ByteArrayBufEntry : public BufEntry { public: - ByteArrayBufEntry(unsigned char* bytes, size_t length, + ByteArrayBufEntry(std::vector bytes, std::unique_ptr progressUpdate); virtual ~ByteArrayBufEntry(); virtual ssize_t send(const std::shared_ptr& socket, @@ -87,8 +88,7 @@ private: virtual const unsigned char* getData() const CXX11_OVERRIDE; private: - unsigned char* bytes_; - size_t length_; + std::vector bytes_; }; class StringBufEntry : public BufEntry { @@ -123,13 +123,11 @@ public: SocketBuffer(const SocketBuffer&) = delete; SocketBuffer& operator=(const SocketBuffer&) = delete; - // Feeds data pointed by bytes with length len into queue. This - // object gets ownership of bytes, so caller must not delete or - // later bytes after this call. This function doesn't send data. If + // Feeds |bytes| into queue. This function doesn't send data. If // progressUpdate is not null, its update() function will be called // each time the data is sent. It will be deleted by this object. It // can be null. - void pushBytes(unsigned char* bytes, size_t len, + void pushBytes(std::vector bytes, std::unique_ptr progressUpdate = nullptr); // Feeds data into queue. This function doesn't send data. If diff --git a/src/ZeroBtMessage.cc b/src/ZeroBtMessage.cc index 36c92201..d5641b06 100644 --- a/src/ZeroBtMessage.cc +++ b/src/ZeroBtMessage.cc @@ -42,15 +42,15 @@ ZeroBtMessage::ZeroBtMessage(uint8_t id, const char* name) { } -unsigned char* ZeroBtMessage::createMessage() +std::vector ZeroBtMessage::createMessage() { /** * len --- 1, 4bytes * id --- ?, 1byte * total: 5bytes */ - auto msg = new unsigned char[MESSAGE_LENGTH]; - bittorrent::createPeerMessageString(msg, MESSAGE_LENGTH, 1, getId()); + auto msg = std::vector(MESSAGE_LENGTH); + bittorrent::createPeerMessageString(msg.data(), MESSAGE_LENGTH, 1, getId()); return msg; } diff --git a/src/ZeroBtMessage.h b/src/ZeroBtMessage.h index af80ac78..875fd166 100644 --- a/src/ZeroBtMessage.h +++ b/src/ZeroBtMessage.h @@ -56,7 +56,7 @@ protected: public: ZeroBtMessage(uint8_t id, const char* name); - virtual unsigned char* createMessage() CXX11_OVERRIDE; + virtual std::vector createMessage() CXX11_OVERRIDE; virtual size_t getMessageLength() CXX11_OVERRIDE; diff --git a/test/BtAllowedFastMessageTest.cc b/test/BtAllowedFastMessageTest.cc index ccc2cad8..ee2509ae 100644 --- a/test/BtAllowedFastMessageTest.cc +++ b/test/BtAllowedFastMessageTest.cc @@ -70,9 +70,9 @@ void BtAllowedFastMessageTest::testCreateMessage() unsigned char data[9]; bittorrent::createPeerMessageString(data, sizeof(data), 5, 17); bittorrent::setIntParam(&data[5], 12345); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 9) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)9, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtAllowedFastMessageTest::testDoReceivedAction() diff --git a/test/BtBitfieldMessageTest.cc b/test/BtBitfieldMessageTest.cc index a3059381..f4b248fe 100644 --- a/test/BtBitfieldMessageTest.cc +++ b/test/BtBitfieldMessageTest.cc @@ -76,9 +76,9 @@ void BtBitfieldMessageTest::testCreateMessage() unsigned char data[5 + 2]; bittorrent::createPeerMessageString(data, sizeof(data), 3, 5); memcpy(&data[5], bitfield, sizeof(bitfield)); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 7) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)7, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); CPPUNIT_ASSERT_EQUAL((size_t)7, msg.getMessageLength()); } diff --git a/test/BtCancelMessageTest.cc b/test/BtCancelMessageTest.cc index f1a7e0a8..37ee4987 100644 --- a/test/BtCancelMessageTest.cc +++ b/test/BtCancelMessageTest.cc @@ -95,9 +95,9 @@ void BtCancelMessageTest::testCreateMessage() bittorrent::setIntParam(&data[5], 12345); bittorrent::setIntParam(&data[9], 256); bittorrent::setIntParam(&data[13], 1_k); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 17) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)17, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtCancelMessageTest::testDoReceivedAction() diff --git a/test/BtChokeMessageTest.cc b/test/BtChokeMessageTest.cc index fa73742b..debd2530 100644 --- a/test/BtChokeMessageTest.cc +++ b/test/BtChokeMessageTest.cc @@ -109,9 +109,9 @@ void BtChokeMessageTest::testCreateMessage() BtChokeMessage msg; unsigned char data[5]; bittorrent::createPeerMessageString(data, sizeof(data), 1, 0); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 5) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)5, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtChokeMessageTest::testDoReceivedAction() diff --git a/test/BtExtendedMessageTest.cc b/test/BtExtendedMessageTest.cc index 65d4fdbc..5e7d4ca6 100644 --- a/test/BtExtendedMessageTest.cc +++ b/test/BtExtendedMessageTest.cc @@ -78,9 +78,9 @@ void BtExtendedMessageTest::testCreateMessage() bittorrent::createPeerMessageString(data, sizeof(data), 13, 20); *(data + 5) = extendedMessageID; memcpy(data + 6, payload.c_str(), payload.size()); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 17) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)17, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); CPPUNIT_ASSERT_EQUAL((size_t)17, msg.getMessageLength()); } diff --git a/test/BtHandshakeMessageTest.cc b/test/BtHandshakeMessageTest.cc index a86ae54a..b8569d73 100644 --- a/test/BtHandshakeMessageTest.cc +++ b/test/BtHandshakeMessageTest.cc @@ -73,23 +73,23 @@ void BtHandshakeMessageTest::testCreate() void BtHandshakeMessageTest::testCreateMessage() { - unsigned char infoHash[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - unsigned char peerId[] = {0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0}; + constexpr unsigned char infoHash[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + constexpr unsigned char peerId[] = {0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0}; - std::shared_ptr msg(new BtHandshakeMessage()); + auto msg = std::make_shared(); msg->setInfoHash(infoHash); msg->setPeerId(peerId); unsigned char data[68]; createHandshakeMessageData(data); - unsigned char* rawmsg = msg->createMessage(); + auto rawmsg = msg->createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)68, rawmsg.size()); CPPUNIT_ASSERT_EQUAL(util::toHex((const unsigned char*)data, 68), - util::toHex(rawmsg, 68)); - delete[] rawmsg; + util::toHex(rawmsg.data(), 68)); } void BtHandshakeMessageTest::testToString() diff --git a/test/BtHaveAllMessageTest.cc b/test/BtHaveAllMessageTest.cc index 56e9504f..9bff0632 100644 --- a/test/BtHaveAllMessageTest.cc +++ b/test/BtHaveAllMessageTest.cc @@ -65,9 +65,9 @@ void BtHaveAllMessageTest::testCreateMessage() BtHaveAllMessage msg; unsigned char data[5]; bittorrent::createPeerMessageString(data, sizeof(data), 1, 14); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 5) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)5, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtHaveAllMessageTest::testDoReceivedAction() diff --git a/test/BtHaveMessageTest.cc b/test/BtHaveMessageTest.cc index 562a5033..677ff2b2 100644 --- a/test/BtHaveMessageTest.cc +++ b/test/BtHaveMessageTest.cc @@ -71,9 +71,9 @@ void BtHaveMessageTest::testCreateMessage() unsigned char data[9]; bittorrent::createPeerMessageString(data, sizeof(data), 5, 4); bittorrent::setIntParam(&data[5], 12345); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 9) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)9, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtHaveMessageTest::testDoReceivedAction() diff --git a/test/BtHaveNoneMessageTest.cc b/test/BtHaveNoneMessageTest.cc index c5ee6d0d..71ab3f3e 100644 --- a/test/BtHaveNoneMessageTest.cc +++ b/test/BtHaveNoneMessageTest.cc @@ -62,9 +62,9 @@ void BtHaveNoneMessageTest::testCreateMessage() BtHaveNoneMessage msg; unsigned char data[5]; bittorrent::createPeerMessageString(data, sizeof(data), 1, 15); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 5) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)5, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtHaveNoneMessageTest::testDoReceivedAction() diff --git a/test/BtInterestedMessageTest.cc b/test/BtInterestedMessageTest.cc index c3096d3e..79e73216 100644 --- a/test/BtInterestedMessageTest.cc +++ b/test/BtInterestedMessageTest.cc @@ -64,9 +64,9 @@ void BtInterestedMessageTest::testCreateMessage() BtInterestedMessage msg; unsigned char data[5]; bittorrent::createPeerMessageString(data, sizeof(data), 1, 2); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 5) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)5, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtInterestedMessageTest::testDoReceivedAction() diff --git a/test/BtKeepAliveMessageTest.cc b/test/BtKeepAliveMessageTest.cc index 3bd27543..36d2eb59 100644 --- a/test/BtKeepAliveMessageTest.cc +++ b/test/BtKeepAliveMessageTest.cc @@ -28,9 +28,9 @@ void BtKeepAliveMessageTest::testCreateMessage() BtKeepAliveMessage message; CPPUNIT_ASSERT_EQUAL((uint8_t)99, message.getId()); CPPUNIT_ASSERT_EQUAL((size_t)4, message.getMessageLength()); - unsigned char* rawmsg = message.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 4) == 0); - delete[] rawmsg; + auto rawmsg = message.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)4, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtKeepAliveMessageTest::testToString() diff --git a/test/BtNotInterestedMessageTest.cc b/test/BtNotInterestedMessageTest.cc index 1f3bbac5..88d233c2 100644 --- a/test/BtNotInterestedMessageTest.cc +++ b/test/BtNotInterestedMessageTest.cc @@ -64,9 +64,9 @@ void BtNotInterestedMessageTest::testCreateMessage() BtNotInterestedMessage msg; unsigned char data[5]; bittorrent::createPeerMessageString(data, sizeof(data), 1, 3); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 5) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)5, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtNotInterestedMessageTest::testDoReceivedAction() diff --git a/test/BtPortMessageTest.cc b/test/BtPortMessageTest.cc index cceb893c..c0370efc 100644 --- a/test/BtPortMessageTest.cc +++ b/test/BtPortMessageTest.cc @@ -99,9 +99,9 @@ void BtPortMessageTest::testCreateMessage() unsigned char data[7]; bittorrent::createPeerMessageString(data, sizeof(data), 3, 9); bittorrent::setShortIntParam(&data[5], 6881); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 7) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)7, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtPortMessageTest::testDoReceivedAction() diff --git a/test/BtRejectMessageTest.cc b/test/BtRejectMessageTest.cc index 3e3b7f8e..3c85ff92 100644 --- a/test/BtRejectMessageTest.cc +++ b/test/BtRejectMessageTest.cc @@ -129,9 +129,9 @@ void BtRejectMessageTest::testCreateMessage() bittorrent::setIntParam(&data[5], 12345); bittorrent::setIntParam(&data[9], 256); bittorrent::setIntParam(&data[13], 1_k); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 17) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)17, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtRejectMessageTest::testDoReceivedAction() diff --git a/test/BtRequestMessageTest.cc b/test/BtRequestMessageTest.cc index 3ff3d7a9..a68fb4d4 100644 --- a/test/BtRequestMessageTest.cc +++ b/test/BtRequestMessageTest.cc @@ -151,9 +151,9 @@ void BtRequestMessageTest::testCreateMessage() bittorrent::setIntParam(&data[5], 12345); bittorrent::setIntParam(&data[9], 256); bittorrent::setIntParam(&data[13], 1_k); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 17) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)17, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtRequestMessageTest::testDoReceivedAction_hasPieceAndAmNotChoking() diff --git a/test/BtSuggestPieceMessageTest.cc b/test/BtSuggestPieceMessageTest.cc index 7e48628e..9be0b8b1 100644 --- a/test/BtSuggestPieceMessageTest.cc +++ b/test/BtSuggestPieceMessageTest.cc @@ -62,9 +62,9 @@ void BtSuggestPieceMessageTest::testCreateMessage() unsigned char data[9]; bittorrent::createPeerMessageString(data, sizeof(data), 5, 13); bittorrent::setIntParam(&data[5], 12345); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 9) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)9, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtSuggestPieceMessageTest::testToString() diff --git a/test/BtUnchokeMessageTest.cc b/test/BtUnchokeMessageTest.cc index dea19a9d..1fe0bbe9 100644 --- a/test/BtUnchokeMessageTest.cc +++ b/test/BtUnchokeMessageTest.cc @@ -64,9 +64,9 @@ void BtUnchokeMessageTest::testCreateMessage() BtUnchokeMessage msg; unsigned char data[5]; bittorrent::createPeerMessageString(data, sizeof(data), 1, 1); - unsigned char* rawmsg = msg.createMessage(); - CPPUNIT_ASSERT(memcmp(rawmsg, data, 5) == 0); - delete[] rawmsg; + auto rawmsg = msg.createMessage(); + CPPUNIT_ASSERT_EQUAL((size_t)5, rawmsg.size()); + CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); } void BtUnchokeMessageTest::testDoReceivedAction() From dae42d0cd0c932f0642cff68ba922760a67bdd75 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 15 May 2016 23:44:54 +0900 Subject: [PATCH 2/7] Remove unused SimpleBtMessage::getMessageLength --- src/BtBitfieldMessage.cc | 2 -- src/BtBitfieldMessage.h | 2 -- src/BtExtendedMessage.cc | 8 -------- src/BtExtendedMessage.h | 2 -- src/BtHandshakeMessage.cc | 2 -- src/BtHandshakeMessage.h | 2 -- src/BtKeepAliveMessage.cc | 2 -- src/BtKeepAliveMessage.h | 2 -- src/BtPortMessage.cc | 2 -- src/BtPortMessage.h | 2 -- src/IndexBtMessage.cc | 2 -- src/IndexBtMessage.h | 2 -- src/RangeBtMessage.cc | 2 -- src/RangeBtMessage.h | 2 -- src/SimpleBtMessage.cc | 1 - src/SimpleBtMessage.h | 2 -- src/ZeroBtMessage.cc | 2 -- src/ZeroBtMessage.h | 2 -- test/BtBitfieldMessageTest.cc | 1 - test/BtExtendedMessageTest.cc | 1 - test/BtKeepAliveMessageTest.cc | 1 - 21 files changed, 44 deletions(-) diff --git a/src/BtBitfieldMessage.cc b/src/BtBitfieldMessage.cc index 64418a0c..e53cdf85 100644 --- a/src/BtBitfieldMessage.cc +++ b/src/BtBitfieldMessage.cc @@ -113,8 +113,6 @@ std::vector BtBitfieldMessage::createMessage() return msg; } -size_t BtBitfieldMessage::getMessageLength() { return 5 + bitfieldLength_; } - std::string BtBitfieldMessage::toString() const { std::string s = NAME; diff --git a/src/BtBitfieldMessage.h b/src/BtBitfieldMessage.h index 195b1d1e..0015d439 100644 --- a/src/BtBitfieldMessage.h +++ b/src/BtBitfieldMessage.h @@ -68,8 +68,6 @@ public: virtual std::vector createMessage() CXX11_OVERRIDE; - virtual size_t getMessageLength() CXX11_OVERRIDE; - virtual std::string toString() const CXX11_OVERRIDE; }; diff --git a/src/BtExtendedMessage.cc b/src/BtExtendedMessage.cc index 10517b3b..9f329c42 100644 --- a/src/BtExtendedMessage.cc +++ b/src/BtExtendedMessage.cc @@ -78,14 +78,6 @@ std::vector BtExtendedMessage::createMessage() return msg; } -size_t BtExtendedMessage::getMessageLength() -{ - if (!msgLength_) { - msgLength_ = 6 + extensionMessage_->getPayload().size(); - } - return msgLength_; -} - bool BtExtendedMessage::sendPredicate() const { return getPeer()->isExtendedMessagingEnabled(); diff --git a/src/BtExtendedMessage.h b/src/BtExtendedMessage.h index c22824d1..b61d4dfb 100644 --- a/src/BtExtendedMessage.h +++ b/src/BtExtendedMessage.h @@ -63,8 +63,6 @@ public: virtual std::vector createMessage() CXX11_OVERRIDE; - virtual size_t getMessageLength() CXX11_OVERRIDE; - virtual bool sendPredicate() const CXX11_OVERRIDE; virtual std::string toString() const CXX11_OVERRIDE; diff --git a/src/BtHandshakeMessage.cc b/src/BtHandshakeMessage.cc index 7f322f57..ce6023e7 100644 --- a/src/BtHandshakeMessage.cc +++ b/src/BtHandshakeMessage.cc @@ -93,8 +93,6 @@ std::vector BtHandshakeMessage::createMessage() return msg; } -size_t BtHandshakeMessage::getMessageLength() { return MESSAGE_LENGTH; } - std::string BtHandshakeMessage::toString() const { return fmt("%s peerId=%s, reserved=%s", NAME, diff --git a/src/BtHandshakeMessage.h b/src/BtHandshakeMessage.h index b1a55ad2..3aeeaf11 100644 --- a/src/BtHandshakeMessage.h +++ b/src/BtHandshakeMessage.h @@ -81,8 +81,6 @@ public: virtual std::vector createMessage() CXX11_OVERRIDE; - virtual size_t getMessageLength() CXX11_OVERRIDE; - virtual std::string toString() const CXX11_OVERRIDE; bool isFastExtensionSupported() const; diff --git a/src/BtKeepAliveMessage.cc b/src/BtKeepAliveMessage.cc index bf656e46..b2172d7d 100644 --- a/src/BtKeepAliveMessage.cc +++ b/src/BtKeepAliveMessage.cc @@ -48,6 +48,4 @@ std::vector BtKeepAliveMessage::createMessage() return std::vector(MESSAGE_LENGTH); } -size_t BtKeepAliveMessage::getMessageLength() { return MESSAGE_LENGTH; } - } // namespace aria2 diff --git a/src/BtKeepAliveMessage.h b/src/BtKeepAliveMessage.h index 9312b48c..73bf05d8 100644 --- a/src/BtKeepAliveMessage.h +++ b/src/BtKeepAliveMessage.h @@ -54,8 +54,6 @@ public: virtual std::vector createMessage() CXX11_OVERRIDE; - virtual size_t getMessageLength() CXX11_OVERRIDE; - virtual std::string toString() const CXX11_OVERRIDE { return NAME; } }; diff --git a/src/BtPortMessage.cc b/src/BtPortMessage.cc index 4bc1d957..6a6c8d0f 100644 --- a/src/BtPortMessage.cc +++ b/src/BtPortMessage.cc @@ -114,8 +114,6 @@ std::vector BtPortMessage::createMessage() return msg; } -size_t BtPortMessage::getMessageLength() { return MESSAGE_LENGTH; } - std::string BtPortMessage::toString() const { return fmt("%s port=%u", NAME, port_); diff --git a/src/BtPortMessage.h b/src/BtPortMessage.h index ede01c00..ded9428b 100644 --- a/src/BtPortMessage.h +++ b/src/BtPortMessage.h @@ -73,8 +73,6 @@ public: virtual std::vector createMessage() CXX11_OVERRIDE; - virtual size_t getMessageLength() CXX11_OVERRIDE; - virtual std::string toString() const CXX11_OVERRIDE; void setLocalNode(DHTNode* localNode); diff --git a/src/IndexBtMessage.cc b/src/IndexBtMessage.cc index f71d361d..a31e654d 100644 --- a/src/IndexBtMessage.cc +++ b/src/IndexBtMessage.cc @@ -53,8 +53,6 @@ std::vector IndexBtMessage::createMessage() return msg; } -size_t IndexBtMessage::getMessageLength() { return MESSAGE_LENGTH; } - std::string IndexBtMessage::toString() const { return fmt("%s index=%lu", getName(), static_cast(index_)); diff --git a/src/IndexBtMessage.h b/src/IndexBtMessage.h index 76f44bac..e4ed881b 100644 --- a/src/IndexBtMessage.h +++ b/src/IndexBtMessage.h @@ -67,8 +67,6 @@ public: virtual std::vector createMessage() CXX11_OVERRIDE; - virtual size_t getMessageLength() CXX11_OVERRIDE; - virtual std::string toString() const CXX11_OVERRIDE; }; diff --git a/src/RangeBtMessage.cc b/src/RangeBtMessage.cc index 2f811ce7..ffda1801 100644 --- a/src/RangeBtMessage.cc +++ b/src/RangeBtMessage.cc @@ -63,8 +63,6 @@ std::vector RangeBtMessage::createMessage() return msg; } -size_t RangeBtMessage::getMessageLength() { return MESSAGE_LENGTH; } - std::string RangeBtMessage::toString() const { return fmt("%s index=%lu, begin=%d, length=%d", getName(), diff --git a/src/RangeBtMessage.h b/src/RangeBtMessage.h index 11fd8aa9..73c8f9eb 100644 --- a/src/RangeBtMessage.h +++ b/src/RangeBtMessage.h @@ -77,8 +77,6 @@ public: virtual std::vector createMessage() CXX11_OVERRIDE; - virtual size_t getMessageLength() CXX11_OVERRIDE; - virtual std::string toString() const CXX11_OVERRIDE; }; diff --git a/src/SimpleBtMessage.cc b/src/SimpleBtMessage.cc index 57bc5aa2..92f1a8a8 100644 --- a/src/SimpleBtMessage.cc +++ b/src/SimpleBtMessage.cc @@ -57,7 +57,6 @@ void SimpleBtMessage::send() getPeer()->getIPAddress().c_str(), getPeer()->getPort(), toString().c_str())); auto msg = createMessage(); - size_t msgLength = getMessageLength(); A2_LOG_DEBUG( fmt("msglength = %lu bytes", static_cast(msg.size()))); getPeerConnection()->pushBytes(std::move(msg), getProgressUpdate()); diff --git a/src/SimpleBtMessage.h b/src/SimpleBtMessage.h index c1398149..76331682 100644 --- a/src/SimpleBtMessage.h +++ b/src/SimpleBtMessage.h @@ -51,8 +51,6 @@ public: virtual std::vector createMessage() = 0; - virtual size_t getMessageLength() = 0; - virtual std::unique_ptr getProgressUpdate(); virtual bool sendPredicate() const { return true; }; diff --git a/src/ZeroBtMessage.cc b/src/ZeroBtMessage.cc index d5641b06..dbe10f94 100644 --- a/src/ZeroBtMessage.cc +++ b/src/ZeroBtMessage.cc @@ -54,8 +54,6 @@ std::vector ZeroBtMessage::createMessage() return msg; } -size_t ZeroBtMessage::getMessageLength() { return MESSAGE_LENGTH; } - std::string ZeroBtMessage::toString() const { return getName(); } } // namespace aria2 diff --git a/src/ZeroBtMessage.h b/src/ZeroBtMessage.h index 875fd166..8afd3334 100644 --- a/src/ZeroBtMessage.h +++ b/src/ZeroBtMessage.h @@ -58,8 +58,6 @@ public: virtual std::vector createMessage() CXX11_OVERRIDE; - virtual size_t getMessageLength() CXX11_OVERRIDE; - virtual std::string toString() const CXX11_OVERRIDE; }; diff --git a/test/BtBitfieldMessageTest.cc b/test/BtBitfieldMessageTest.cc index f4b248fe..90b07810 100644 --- a/test/BtBitfieldMessageTest.cc +++ b/test/BtBitfieldMessageTest.cc @@ -79,7 +79,6 @@ void BtBitfieldMessageTest::testCreateMessage() auto rawmsg = msg.createMessage(); CPPUNIT_ASSERT_EQUAL((size_t)7, rawmsg.size()); CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); - CPPUNIT_ASSERT_EQUAL((size_t)7, msg.getMessageLength()); } void BtBitfieldMessageTest::testDoReceivedAction() diff --git a/test/BtExtendedMessageTest.cc b/test/BtExtendedMessageTest.cc index 5e7d4ca6..f32f3426 100644 --- a/test/BtExtendedMessageTest.cc +++ b/test/BtExtendedMessageTest.cc @@ -81,7 +81,6 @@ void BtExtendedMessageTest::testCreateMessage() auto rawmsg = msg.createMessage(); CPPUNIT_ASSERT_EQUAL((size_t)17, rawmsg.size()); CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); - CPPUNIT_ASSERT_EQUAL((size_t)17, msg.getMessageLength()); } void BtExtendedMessageTest::testDoReceivedAction() diff --git a/test/BtKeepAliveMessageTest.cc b/test/BtKeepAliveMessageTest.cc index 36d2eb59..2d9d4872 100644 --- a/test/BtKeepAliveMessageTest.cc +++ b/test/BtKeepAliveMessageTest.cc @@ -27,7 +27,6 @@ void BtKeepAliveMessageTest::testCreateMessage() memset(data, 0, sizeof(data)); BtKeepAliveMessage message; CPPUNIT_ASSERT_EQUAL((uint8_t)99, message.getId()); - CPPUNIT_ASSERT_EQUAL((size_t)4, message.getMessageLength()); auto rawmsg = message.createMessage(); CPPUNIT_ASSERT_EQUAL((size_t)4, rawmsg.size()); CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data)); From cef9109070f586f49bed06ad731a4d5339d778c5 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 16 May 2016 00:03:02 +0900 Subject: [PATCH 3/7] Refactor BtBitfieldMessage --- src/BtBitfieldMessage.cc | 30 ++++++++++-------------------- src/BtBitfieldMessage.h | 7 +++---- 2 files changed, 13 insertions(+), 24 deletions(-) diff --git a/src/BtBitfieldMessage.cc b/src/BtBitfieldMessage.cc index e53cdf85..eaeb610e 100644 --- a/src/BtBitfieldMessage.cc +++ b/src/BtBitfieldMessage.cc @@ -48,16 +48,12 @@ namespace aria2 { const char BtBitfieldMessage::NAME[] = "bitfield"; -BtBitfieldMessage::BtBitfieldMessage() - : SimpleBtMessage(ID, NAME), bitfieldLength_(0) -{ -} +BtBitfieldMessage::BtBitfieldMessage() : SimpleBtMessage(ID, NAME) {} BtBitfieldMessage::BtBitfieldMessage(const unsigned char* bitfield, size_t bitfieldLength) - : SimpleBtMessage(ID, NAME), bitfieldLength_(0) + : SimpleBtMessage(ID, NAME), bitfield_(bitfield, bitfield + bitfieldLength) { - setBitfield(bitfield, bitfieldLength); } BtBitfieldMessage::~BtBitfieldMessage() {} @@ -65,13 +61,7 @@ BtBitfieldMessage::~BtBitfieldMessage() {} void BtBitfieldMessage::setBitfield(const unsigned char* bitfield, size_t bitfieldLength) { - if (bitfield_.get() == bitfield) { - return; - } - - bitfieldLength_ = bitfieldLength; - bitfield_ = make_unique(bitfieldLength_); - memcpy(bitfield_.get(), bitfield, bitfieldLength_); + bitfield_.assign(bitfield, bitfield + bitfieldLength); } std::unique_ptr @@ -89,9 +79,9 @@ void BtBitfieldMessage::doReceivedAction() if (isMetadataGetMode()) { return; } - getPieceStorage()->updatePieceStats(bitfield_.get(), bitfieldLength_, + getPieceStorage()->updatePieceStats(bitfield_.data(), bitfield_.size(), getPeer()->getBitfield()); - getPeer()->setBitfield(bitfield_.get(), bitfieldLength_); + getPeer()->setBitfield(bitfield_.data(), bitfield_.size()); if (getPeer()->isSeeder() && getPieceStorage()->downloadFinished()) { throw DL_ABORT_EX(MSG_GOOD_BYE_SEEDER); } @@ -105,19 +95,19 @@ std::vector BtBitfieldMessage::createMessage() * bitfield --- bitfield, bitfieldLength bytes * total: 5+bitfieldLength bytes */ - const size_t msgLength = 5 + bitfieldLength_; + const size_t msgLength = 5 + bitfield_.size(); auto msg = std::vector(msgLength); bittorrent::createPeerMessageString(msg.data(), msgLength, - 1 + bitfieldLength_, ID); - memcpy(msg.data() + 5, bitfield_.get(), bitfieldLength_); + 1 + bitfield_.size(), ID); + std::copy(std::begin(bitfield_), std::end(bitfield_), std::begin(msg) + 5); return msg; } std::string BtBitfieldMessage::toString() const { std::string s = NAME; - s += " "; - s += util::toHex(bitfield_.get(), bitfieldLength_); + s += ' '; + s += util::toHex(bitfield_.data(), bitfield_.size()); return s; } diff --git a/src/BtBitfieldMessage.h b/src/BtBitfieldMessage.h index 0015d439..4d492b83 100644 --- a/src/BtBitfieldMessage.h +++ b/src/BtBitfieldMessage.h @@ -41,8 +41,7 @@ namespace aria2 { class BtBitfieldMessage : public SimpleBtMessage { private: - std::unique_ptr bitfield_; - size_t bitfieldLength_; + std::vector bitfield_; public: BtBitfieldMessage(); @@ -57,9 +56,9 @@ public: void setBitfield(const unsigned char* bitfield, size_t bitfieldLength); - const unsigned char* getBitfield() const { return bitfield_.get(); } + const unsigned char* getBitfield() const { return bitfield_.data(); } - size_t getBitfieldLength() const { return bitfieldLength_; } + size_t getBitfieldLength() const { return bitfield_.size(); } static std::unique_ptr create(const unsigned char* data, size_t dataLength); From 56a114746a88aa7be71a1da011abee35a8334d0b Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 16 May 2016 00:05:28 +0900 Subject: [PATCH 4/7] Use std::make_shared for efficiency --- src/DefaultPieceStorage.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DefaultPieceStorage.cc b/src/DefaultPieceStorage.cc index a152c368..a13dc19f 100644 --- a/src/DefaultPieceStorage.cc +++ b/src/DefaultPieceStorage.cc @@ -626,7 +626,7 @@ void DefaultPieceStorage::initStorage() { if (downloadContext_->getFileEntries().size() == 1) { A2_LOG_DEBUG("Instantiating DirectDiskAdaptor"); - auto directDiskAdaptor = make_unique(); + auto directDiskAdaptor = std::make_shared(); directDiskAdaptor->setTotalLength(downloadContext_->getTotalLength()); directDiskAdaptor->setFileEntries( downloadContext_->getFileEntries().begin(), @@ -638,7 +638,7 @@ void DefaultPieceStorage::initStorage() } else { A2_LOG_DEBUG("Instantiating MultiDiskAdaptor"); - auto multiDiskAdaptor = make_unique(); + auto multiDiskAdaptor = std::make_shared(); multiDiskAdaptor->setFileEntries(downloadContext_->getFileEntries().begin(), downloadContext_->getFileEntries().end()); multiDiskAdaptor->setPieceLength(downloadContext_->getPieceLength()); From 949a580a14cd3afcdf9904acd1d32397c344dd28 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Wed, 18 May 2016 22:59:46 +0900 Subject: [PATCH 5/7] mingw32: Gain privilege before opening files --- src/FallocFileAllocationIterator.cc | 17 ----------------- src/FallocFileAllocationIterator.h | 4 ---- src/RequestGroup.cc | 29 +++++++++++++++++++++++++++++ src/option_processing.cc | 10 ---------- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/FallocFileAllocationIterator.cc b/src/FallocFileAllocationIterator.cc index 04590557..ec64c539 100644 --- a/src/FallocFileAllocationIterator.cc +++ b/src/FallocFileAllocationIterator.cc @@ -39,28 +39,11 @@ namespace aria2 { -#ifdef __MINGW32__ -bool FallocFileAllocationIterator::gainPrivilegeAttempted_ = false; -#endif // __MINGW32__ - FallocFileAllocationIterator::FallocFileAllocationIterator(BinaryStream* stream, int64_t offset, int64_t totalLength) : stream_(stream), offset_(offset), totalLength_(totalLength) { -#ifdef __MINGW32__ - // Windows build: --file-allocation=falloc uses SetFileValidData - // which requires SE_MANAGE_VOLUME_NAME privilege. SetFileValidData - // has security implications (see - // https://msdn.microsoft.com/en-us/library/windows/desktop/aa365544%28v=vs.85%29.aspx). - if (!gainPrivilegeAttempted_) { - if (!util::gainPrivilege(SE_MANAGE_VOLUME_NAME)) { - A2_LOG_WARN("--file-allocation=falloc will not work properly."); - } - - gainPrivilegeAttempted_ = true; - } -#endif // __MINGW32__ } void FallocFileAllocationIterator::allocateChunk() diff --git a/src/FallocFileAllocationIterator.h b/src/FallocFileAllocationIterator.h index 08b8b4a1..fb306af1 100644 --- a/src/FallocFileAllocationIterator.h +++ b/src/FallocFileAllocationIterator.h @@ -47,10 +47,6 @@ private: int64_t offset_; int64_t totalLength_; -#ifdef __MINGW32__ - static bool gainPrivilegeAttempted_; -#endif // __MINGW32__ - public: FallocFileAllocationIterator(BinaryStream* stream, int64_t offset, int64_t totalLength); diff --git a/src/RequestGroup.cc b/src/RequestGroup.cc index 85b75a45..fd8cda49 100644 --- a/src/RequestGroup.cc +++ b/src/RequestGroup.cc @@ -604,6 +604,35 @@ void RequestGroup::initPieceStorage() segmentMan_ = std::make_shared(downloadContext_, tempPieceStorage); pieceStorage_ = tempPieceStorage; + +#ifdef __MINGW32__ + // Windows build: --file-allocation=falloc uses SetFileValidData + // which requires SE_MANAGE_VOLUME_NAME privilege. SetFileValidData + // has security implications (see + // https://msdn.microsoft.com/en-us/library/windows/desktop/aa365544%28v=vs.85%29.aspx). + static auto gainPrivilegeAttempted = false; + + if (!gainPrivilegeAttempted && + pieceStorage_->getDiskAdaptor()->getFileAllocationMethod() == + DiskAdaptor::FILE_ALLOC_FALLOC && + isFileAllocationEnabled()) { + if (!util::gainPrivilege(SE_MANAGE_VOLUME_NAME)) { + A2_LOG_WARN("--file-allocation=falloc will not work properly."); + } + else { + A2_LOG_DEBUG("SE_MANAGE_VOLUME_NAME privilege acquired"); + + A2_LOG_WARN( + "--file-allocation=falloc will use SetFileValidData() API, and " + "aria2 uses uninitialized disk space which may contain " + "confidential data as the download file space. If it is " + "undesirable, --file-allocation=prealloc is slower, but safer " + "option."); + } + + gainPrivilegeAttempted = true; + } +#endif // __MINGW32__ } void RequestGroup::dropPieceStorage() diff --git a/src/option_processing.cc b/src/option_processing.cc index f6b12358..652a3bd3 100644 --- a/src/option_processing.cc +++ b/src/option_processing.cc @@ -341,16 +341,6 @@ error_code::Value option_processing(Option& op, bool standalone, op.remove(PREF_DEFERRED_INPUT); } -#ifdef __MINGW32__ - if (op.get(PREF_FILE_ALLOCATION) == V_FALLOC) { - A2_LOG_WARN( - "--file-allocation=falloc will use SetFileValidData() API, and " - "aria2 uses uninitialized disk space which may contain " - "confidential data as the download file space. If it is " - "undesirable, --file-allocation=prealloc is slower, but safer option."); - } -#endif // __MINGW32__ - return error_code::FINISHED; } From 5b5e08b2164d9dec32b6c7120ec27d8ce2ff5aac Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 22 May 2016 00:30:56 +0900 Subject: [PATCH 6/7] Use expat-2.1.1 for binary builds --- README.android | 2 +- README.mingw | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.android b/README.android index 3626aa5e..e8610e0f 100644 --- a/README.android +++ b/README.android @@ -43,7 +43,7 @@ aria2c executable was generated using android-ndk-r10d. The following libraries were statically linked. * openssl 1.0.2h -* expat 2.1.0 +* expat 2.1.1 * c-ares 1.11.0 * libssh2 1.7.0 diff --git a/README.mingw b/README.mingw index 315028d9..06ff8596 100644 --- a/README.mingw +++ b/README.mingw @@ -13,7 +13,7 @@ The executable is statically linked, so no extra DLLs are necessary. The linked libraries are: * gmp 6.1.0 -* expat 2.1.0 +* expat 2.1.1 * sqlite 3.10.2 * zlib 1.2.8 * c-ares 1.11.0 From 0b906f40f1204e79cb43af3867468ab02a371075 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 22 May 2016 00:32:54 +0900 Subject: [PATCH 7/7] Use expat-2.1.1 for mingw32 Docker build --- Dockerfile.mingw | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile.mingw b/Dockerfile.mingw index 2c57b2f6..b452a984 100644 --- a/Dockerfile.mingw +++ b/Dockerfile.mingw @@ -30,7 +30,7 @@ RUN apt-get update && \ RUN curl -L -O https://gmplib.org/download/gmp/gmp-6.1.0.tar.lz && \ curl -L -o gmp-6.1.0.patch https://gmplib.org/repo/gmp-6.1/raw-rev/67d4ee9dead1 && \ - curl -L -O http://downloads.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz && \ + curl -L -O http://downloads.sourceforge.net/project/expat/expat/2.1.1/expat-2.1.1.tar.gz && \ curl -L -O https://www.sqlite.org/2016/sqlite-autoconf-3120100.tar.gz && \ curl -L -O http://zlib.net/zlib-1.2.8.tar.xz && \ curl -L -O http://c-ares.haxx.se/download/c-ares-1.11.0.tar.gz && \ @@ -49,8 +49,8 @@ RUN tar xf gmp-6.1.0.tar.lz && \ CFLAGS="-mtune=generic -O2 -g0" && \ make install -RUN tar xf expat-2.1.0.tar.gz && \ - cd expat-2.1.0 && \ +RUN tar xf expat-2.1.1.tar.gz && \ + cd expat-2.1.1 && \ ./configure \ --disable-shared \ --enable-static \