there is a check:
for (POSITION pos = m_DoneBlocks_list.GetHeadPosition(); pos != 0; ){ const Requested_Block_Struct* cur_reqblock = m_DoneBlocks_list.GetNext(pos); if (reqblock->StartOffset == cur_reqblock->StartOffset && reqblock->EndOffset == cur_reqblock->EndOffset){ delete reqblock; return; } } for (POSITION pos = m_BlockRequests_queue.GetHeadPosition(); pos != 0; ){ const Requested_Block_Struct* cur_reqblock = m_BlockRequests_queue.GetNext(pos); if (reqblock->StartOffset == cur_reqblock->StartOffset && reqblock->EndOffset == cur_reqblock->EndOffset){ delete reqblock; return; } }
it should be howeever:
for (POSITION pos = m_DoneBlocks_list.GetHeadPosition(); pos != 0; ){ const Requested_Block_Struct* cur_reqblock = m_DoneBlocks_list.GetNext(pos); if (reqblock->StartOffset == cur_reqblock->StartOffset && reqblock->EndOffset == cur_reqblock->EndOffset && memcmp(reqblock->FileID, cur_reqblock->FileID, 16) == 0){ delete reqblock; return; } } for (POSITION pos = m_BlockRequests_queue.GetHeadPosition(); pos != 0; ){ const Requested_Block_Struct* cur_reqblock = m_BlockRequests_queue.GetNext(pos); if (reqblock->StartOffset == cur_reqblock->StartOffset && reqblock->EndOffset == cur_reqblock->EndOffset && memcmp(reqblock->FileID, cur_reqblock->FileID, 16) == 0){ delete reqblock; return; } }
without checking the FileID the upload wil fail if a client after completing one file switches to an other and requests the same range