diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-02-22 16:11:33 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-02-22 16:11:33 +0000 |
| commit | 232deb47b5af1c0a53c84da18c6cabe6637fcaa8 (patch) | |
| tree | 4c1b077a1e416ba2334e2ccc73059401cb3cd0a5 /src | |
| parent | 6ae5882f3cb644369382583f0cea8d6de6dd3da0 (diff) | |
2010-02-23 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Return SharedHandle<LpdMessage>(new LpdMessage()) if received data
is bad in LpdMessageReceiver.
* src/LpdMessage.h
* src/LpdMessageReceiver.cc
* src/LpdMessageReceiver.h
* src/LpdReceiveMessageCommand.cc
* test/LpdMessageReceiverTest.cc
Diffstat (limited to 'src')
| -rw-r--r-- | src/LpdMessage.h | 2 | ||||
| -rw-r--r-- | src/LpdMessageReceiver.cc | 6 | ||||
| -rw-r--r-- | src/LpdMessageReceiver.h | 6 | ||||
| -rw-r--r-- | src/LpdReceiveMessageCommand.cc | 4 |
4 files changed, 15 insertions, 3 deletions
diff --git a/src/LpdMessage.h b/src/LpdMessage.h index c6647e1d..909689ed 100644 --- a/src/LpdMessage.h +++ b/src/LpdMessage.h @@ -46,6 +46,8 @@ private: SharedHandle<Peer> _peer; std::string _infoHash; public: + LpdMessage() {} + LpdMessage(const SharedHandle<Peer>& peer, const std::string& infoHash): _peer(peer), _infoHash(infoHash) {} diff --git a/src/LpdMessageReceiver.cc b/src/LpdMessageReceiver.cc index e5bcd65b..14082310 100644 --- a/src/LpdMessageReceiver.cc +++ b/src/LpdMessageReceiver.cc @@ -83,6 +83,7 @@ SharedHandle<LpdMessage> LpdMessageReceiver::receiveMessage() HttpHeaderProcessor proc; proc.update(buf, length); if(!proc.eoh()) { + msg.reset(new LpdMessage()); return msg; } SharedHandle<HttpHeader> header = proc.getHttpRequestHeader(); @@ -95,6 +96,7 @@ SharedHandle<LpdMessage> LpdMessageReceiver::receiveMessage() (infoHash = util::fromHex(infoHashString)).empty() || port == 0) { _logger->info("LPD bad request. infohash=%s", infoHashString.c_str()); + msg.reset(new LpdMessage()); return msg; } SharedHandle<Peer> peer(new Peer(peerAddr.first, port, false)); @@ -102,10 +104,12 @@ SharedHandle<LpdMessage> LpdMessageReceiver::receiveMessage() peer->setLocalPeer(true); } msg.reset(new LpdMessage(peer, infoHash)); + return msg; } catch(RecoverableException& e) { _logger->info("Failed to receive LPD message.", e); + msg.reset(new LpdMessage()); + return msg; } - return msg; } } // namespace aria2 diff --git a/src/LpdMessageReceiver.h b/src/LpdMessageReceiver.h index 37baa0eb..9b4a07be 100644 --- a/src/LpdMessageReceiver.h +++ b/src/LpdMessageReceiver.h @@ -60,8 +60,10 @@ public: // No throw. bool init(const std::string& localAddr); - // Receives LPD message and process it. Returns false if message is - // not available. + // Receives LPD message and returns LpdMessage which contains + // sender(peer) and infohash. If no data is available on socket, + // returns SharedHandle<LpdMessage>(). If received data is bad, + // then returns SharedHandle<LpdMessage>(new LpdMessage()) SharedHandle<LpdMessage> receiveMessage(); SharedHandle<SocketCore> getSocket() const diff --git a/src/LpdReceiveMessageCommand.cc b/src/LpdReceiveMessageCommand.cc index 29a6b18e..f3297f90 100644 --- a/src/LpdReceiveMessageCommand.cc +++ b/src/LpdReceiveMessageCommand.cc @@ -83,6 +83,10 @@ bool LpdReceiveMessageCommand::execute() if(m.isNull()) { break; } + if(m->getPeer().isNull()) { + // bad message + continue; + } SharedHandle<BtRegistry> reg = _e->getBtRegistry(); SharedHandle<DownloadContext> dctx = reg->getDownloadContext(m->getInfoHash()); |
