summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-02-22 16:11:33 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-02-22 16:11:33 +0000
commit232deb47b5af1c0a53c84da18c6cabe6637fcaa8 (patch)
tree4c1b077a1e416ba2334e2ccc73059401cb3cd0a5 /src
parent6ae5882f3cb644369382583f0cea8d6de6dd3da0 (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.h2
-rw-r--r--src/LpdMessageReceiver.cc6
-rw-r--r--src/LpdMessageReceiver.h6
-rw-r--r--src/LpdReceiveMessageCommand.cc4
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());