diff options
author | Kahrl <kahrl@gmx.net> | 2013-06-13 03:05:47 +0200 |
---|---|---|
committer | Kahrl <kahrl@gmx.net> | 2013-07-07 08:35:25 +0200 |
commit | b3001bcd6e041f89db8514bf8603214fba6dd91e (patch) | |
tree | 1588826aae1b6795b0fbff65a7431f9aee554704 /src | |
parent | 07715b1b6adbdaeaa3f72591297ad59b443a0d9c (diff) | |
download | minetest-b3001bcd6e041f89db8514bf8603214fba6dd91e.tar.gz minetest-b3001bcd6e041f89db8514bf8603214fba6dd91e.tar.bz2 minetest-b3001bcd6e041f89db8514bf8603214fba6dd91e.zip |
When server sends late media, log to errorstream instead of crashing.
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/client.cpp | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/src/client.cpp b/src/client.cpp index ccd2034fc..19105b504 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -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); |