When server sends late media, log to errorstream instead of crashing.
authorKahrl <kahrl@gmx.net>
Thu, 13 Jun 2013 01:05:47 +0000 (03:05 +0200)
committerKahrl <kahrl@gmx.net>
Sun, 7 Jul 2013 06:35:25 +0000 (08:35 +0200)
Do a check for valid num_files before doing
assert(!m_mesh_update_thread.IsRunning());

In particular, don't execute the assertion if all media has already
been received.

src/client.cpp

index ccd2034fcba428832dcb01aed83f42f59b78a005..19105b504d7d375b84ca24597b3c9c6176410139 100644 (file)
@@ -797,7 +797,8 @@ void Client::step(float dtime)
                        all_stopped &= !(*thread)->IsRunning();
                        while (!(*thread)->m_file_data.empty()) {
                                std::pair <std::string, std::string> out = (*thread)->m_file_data.pop_front();
-                               ++m_media_received_count;
+                               if(m_media_received_count < m_media_count)
+                                       m_media_received_count++;
 
                                bool success = loadMedia(out.second, out.first);
                                if(success){
@@ -1731,15 +1732,9 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
        }
        else if(command == TOCLIENT_MEDIA)
        {
-               if (m_media_count == 0)
-                       return;
                std::string datastring((char*)&data[2], datasize-2);
                std::istringstream is(datastring, std::ios_base::binary);
 
-               // Mesh update thread must be stopped while
-               // updating content definitions
-               assert(!m_mesh_update_thread.IsRunning());
-
                /*
                        u16 command
                        u16 total number of file bunches
@@ -1754,11 +1749,31 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                */
                int num_bunches = readU16(is);
                int bunch_i = readU16(is);
-               int num_files = readU32(is);
+               u32 num_files = readU32(is);
                infostream<<"Client: Received files: bunch "<<bunch_i<<"/"
                                <<num_bunches<<" files="<<num_files
                                <<" size="<<datasize<<std::endl;
-               for(int i=0; i<num_files; i++){
+
+               // Check total and received media count
+               assert(m_media_received_count <= m_media_count);
+               if (num_files > m_media_count - m_media_received_count) {
+                       errorstream<<"Client: Received more files than requested:"
+                               <<" total count="<<m_media_count
+                               <<" total received="<<m_media_received_count
+                               <<" bunch "<<bunch_i<<"/"<<num_bunches
+                               <<" files="<<num_files
+                               <<" size="<<datasize<<std::endl;
+                       num_files = m_media_count - m_media_received_count;
+               }
+               if (num_files == 0)
+                       return;
+
+               // Mesh update thread must be stopped while
+               // updating content definitions
+               assert(!m_mesh_update_thread.IsRunning());
+
+               for(u32 i=0; i<num_files; i++){
+                       assert(m_media_received_count < m_media_count);
                        m_media_received_count++;
                        std::string name = deSerializeString(is);
                        std::string data = deSerializeLongString(is);