Переглянути джерело

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
Tatsuhiro Tsujikawa 15 роки тому
батько
коміт
232deb47b5

+ 10 - 0
ChangeLog

@@ -1,3 +1,13 @@
+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
+
 2010-02-23  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Added --bt-lpd-interface option to specify the interface to use

+ 2 - 0
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) {}
 

+ 5 - 1
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

+ 4 - 2
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

+ 4 - 0
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());

+ 12 - 2
test/LpdMessageReceiverTest.cc

@@ -60,7 +60,10 @@ void LpdMessageReceiverTest::testReceiveMessage()
   sendsock->writeData(request.c_str(), request.size(),
                      LPD_MULTICAST_ADDR, LPD_MULTICAST_PORT);
 
-  CPPUNIT_ASSERT(rcv.receiveMessage().isNull());
+  msg = rcv.receiveMessage();
+  CPPUNIT_ASSERT(!msg.isNull());
+  CPPUNIT_ASSERT(msg->getPeer().isNull());
+  CPPUNIT_ASSERT(msg->getInfoHash().empty());
 
   // Bad port
   request =
@@ -70,7 +73,14 @@ void LpdMessageReceiverTest::testReceiveMessage()
   sendsock->writeData(request.c_str(), request.size(),
                      LPD_MULTICAST_ADDR, LPD_MULTICAST_PORT);
 
-  CPPUNIT_ASSERT(rcv.receiveMessage().isNull());
+  msg = rcv.receiveMessage();
+  CPPUNIT_ASSERT(!msg.isNull());
+  CPPUNIT_ASSERT(msg->getPeer().isNull());
+  CPPUNIT_ASSERT(msg->getInfoHash().empty());
+
+  // No data available
+  msg = rcv.receiveMessage();
+  CPPUNIT_ASSERT(msg.isNull());
 }
 
 } // namespace aria2