summaryrefslogtreecommitdiff
path: root/src/client.cpp
diff options
context:
space:
mode:
authorKahrl <kahrl@gmx.net>2013-06-13 03:05:47 +0200
committerKahrl <kahrl@gmx.net>2013-07-07 08:35:25 +0200
commitb3001bcd6e041f89db8514bf8603214fba6dd91e (patch)
tree1588826aae1b6795b0fbff65a7431f9aee554704 /src/client.cpp
parent07715b1b6adbdaeaa3f72591297ad59b443a0d9c (diff)
downloadminetest-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/client.cpp')
-rw-r--r--src/client.cpp33
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);