mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-06-20 04:14:27 -04:00
Fixed possible crash in ftServer::handleIncoming by checking return value of dynamic_cast.
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@8594 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
014e78dd8c
commit
3abec3363d
1 changed files with 51 additions and 27 deletions
|
@ -1312,16 +1312,21 @@ int ftServer::handleIncoming()
|
||||||
case RS_PKT_SUBTYPE_FT_DATA_REQUEST:
|
case RS_PKT_SUBTYPE_FT_DATA_REQUEST:
|
||||||
{
|
{
|
||||||
RsFileTransferDataRequestItem *f = dynamic_cast<RsFileTransferDataRequestItem*>(item) ;
|
RsFileTransferDataRequestItem *f = dynamic_cast<RsFileTransferDataRequestItem*>(item) ;
|
||||||
|
if (f)
|
||||||
|
{
|
||||||
#ifdef SERVER_DEBUG
|
#ifdef SERVER_DEBUG
|
||||||
std::cerr << "ftServer::handleIncoming: received data request for hash " << f->file.hash << ", offset=" << f->fileoffset << ", chunk size=" << f->chunksize << std::endl;
|
std::cerr << "ftServer::handleIncoming: received data request for hash " << f->file.hash << ", offset=" << f->fileoffset << ", chunk size=" << f->chunksize << std::endl;
|
||||||
#endif
|
#endif
|
||||||
mFtDataplex->recvDataRequest(f->PeerId(), f->file.hash, f->file.filesize, f->fileoffset, f->chunksize);
|
mFtDataplex->recvDataRequest(f->PeerId(), f->file.hash, f->file.filesize, f->fileoffset, f->chunksize);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case RS_PKT_SUBTYPE_FT_DATA:
|
case RS_PKT_SUBTYPE_FT_DATA:
|
||||||
{
|
{
|
||||||
RsFileTransferDataItem *f = dynamic_cast<RsFileTransferDataItem*>(item) ;
|
RsFileTransferDataItem *f = dynamic_cast<RsFileTransferDataItem*>(item) ;
|
||||||
|
if (f)
|
||||||
|
{
|
||||||
#ifdef SERVER_DEBUG
|
#ifdef SERVER_DEBUG
|
||||||
std::cerr << "ftServer::handleIncoming: received data for hash " << f->fd.file.hash << ", offset=" << f->fd.file_offset << ", chunk size=" << f->fd.binData.bin_len << std::endl;
|
std::cerr << "ftServer::handleIncoming: received data for hash " << f->fd.file.hash << ", offset=" << f->fd.file_offset << ", chunk size=" << f->fd.binData.bin_len << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1331,51 +1336,66 @@ int ftServer::handleIncoming()
|
||||||
*/
|
*/
|
||||||
f->fd.binData.TlvShallowClear();
|
f->fd.binData.TlvShallowClear();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case RS_PKT_SUBTYPE_FT_CHUNK_MAP_REQUEST:
|
case RS_PKT_SUBTYPE_FT_CHUNK_MAP_REQUEST:
|
||||||
{
|
{
|
||||||
RsFileTransferChunkMapRequestItem *f = dynamic_cast<RsFileTransferChunkMapRequestItem*>(item) ;
|
RsFileTransferChunkMapRequestItem *f = dynamic_cast<RsFileTransferChunkMapRequestItem*>(item) ;
|
||||||
|
if (f)
|
||||||
|
{
|
||||||
#ifdef SERVER_DEBUG
|
#ifdef SERVER_DEBUG
|
||||||
std::cerr << "ftServer::handleIncoming: received chunkmap request for hash " << f->hash << ", client=" << f->is_client << std::endl;
|
std::cerr << "ftServer::handleIncoming: received chunkmap request for hash " << f->hash << ", client=" << f->is_client << std::endl;
|
||||||
#endif
|
#endif
|
||||||
mFtDataplex->recvChunkMapRequest(f->PeerId(), f->hash,f->is_client) ;
|
mFtDataplex->recvChunkMapRequest(f->PeerId(), f->hash,f->is_client) ;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case RS_PKT_SUBTYPE_FT_CHUNK_MAP:
|
case RS_PKT_SUBTYPE_FT_CHUNK_MAP:
|
||||||
{
|
{
|
||||||
RsFileTransferChunkMapItem *f = dynamic_cast<RsFileTransferChunkMapItem*>(item) ;
|
RsFileTransferChunkMapItem *f = dynamic_cast<RsFileTransferChunkMapItem*>(item) ;
|
||||||
|
if (f)
|
||||||
|
{
|
||||||
#ifdef SERVER_DEBUG
|
#ifdef SERVER_DEBUG
|
||||||
std::cerr << "ftServer::handleIncoming: received chunkmap for hash " << f->hash << ", client=" << f->is_client << /*", map=" << f->compressed_map <<*/ std::endl;
|
std::cerr << "ftServer::handleIncoming: received chunkmap for hash " << f->hash << ", client=" << f->is_client << /*", map=" << f->compressed_map <<*/ std::endl;
|
||||||
#endif
|
#endif
|
||||||
mFtDataplex->recvChunkMap(f->PeerId(), f->hash,f->compressed_map,f->is_client) ;
|
mFtDataplex->recvChunkMap(f->PeerId(), f->hash,f->compressed_map,f->is_client) ;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case RS_PKT_SUBTYPE_FT_CHUNK_CRC_REQUEST:
|
case RS_PKT_SUBTYPE_FT_CHUNK_CRC_REQUEST:
|
||||||
{
|
{
|
||||||
RsFileTransferSingleChunkCrcRequestItem *f = dynamic_cast<RsFileTransferSingleChunkCrcRequestItem*>(item) ;
|
RsFileTransferSingleChunkCrcRequestItem *f = dynamic_cast<RsFileTransferSingleChunkCrcRequestItem*>(item) ;
|
||||||
|
if (f)
|
||||||
|
{
|
||||||
#ifdef SERVER_DEBUG
|
#ifdef SERVER_DEBUG
|
||||||
std::cerr << "ftServer::handleIncoming: received single chunk crc req for hash " << f->hash << ", chunk number=" << f->chunk_number << std::endl;
|
std::cerr << "ftServer::handleIncoming: received single chunk crc req for hash " << f->hash << ", chunk number=" << f->chunk_number << std::endl;
|
||||||
#endif
|
#endif
|
||||||
mFtDataplex->recvSingleChunkCRCRequest(f->PeerId(), f->hash,f->chunk_number) ;
|
mFtDataplex->recvSingleChunkCRCRequest(f->PeerId(), f->hash,f->chunk_number) ;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case RS_PKT_SUBTYPE_FT_CHUNK_CRC:
|
case RS_PKT_SUBTYPE_FT_CHUNK_CRC:
|
||||||
{
|
{
|
||||||
RsFileTransferSingleChunkCrcItem *f = dynamic_cast<RsFileTransferSingleChunkCrcItem *>(item) ;
|
RsFileTransferSingleChunkCrcItem *f = dynamic_cast<RsFileTransferSingleChunkCrcItem *>(item) ;
|
||||||
|
if (f)
|
||||||
|
{
|
||||||
#ifdef SERVER_DEBUG
|
#ifdef SERVER_DEBUG
|
||||||
std::cerr << "ftServer::handleIncoming: received single chunk crc req for hash " << f->hash << ", chunk number=" << f->chunk_number << ", checksum = " << f->check_sum << std::endl;
|
std::cerr << "ftServer::handleIncoming: received single chunk crc req for hash " << f->hash << ", chunk number=" << f->chunk_number << ", checksum = " << f->check_sum << std::endl;
|
||||||
#endif
|
#endif
|
||||||
mFtDataplex->recvSingleChunkCRC(f->PeerId(), f->hash,f->chunk_number,f->check_sum);
|
mFtDataplex->recvSingleChunkCRC(f->PeerId(), f->hash,f->chunk_number,f->check_sum);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case RS_PKT_SUBTYPE_FT_CACHE_ITEM:
|
case RS_PKT_SUBTYPE_FT_CACHE_ITEM:
|
||||||
{
|
{
|
||||||
RsFileTransferCacheItem *ci = dynamic_cast<RsFileTransferCacheItem*>(item) ;
|
RsFileTransferCacheItem *ci = dynamic_cast<RsFileTransferCacheItem*>(item) ;
|
||||||
|
if (ci)
|
||||||
|
{
|
||||||
#ifdef SERVER_DEBUG_CACHE
|
#ifdef SERVER_DEBUG_CACHE
|
||||||
std::cerr << "ftServer::handleIncoming: received cache item hash=" << ci->file.hash << ". from peer " << ci->PeerId() << std::endl;
|
std::cerr << "ftServer::handleIncoming: received cache item hash=" << ci->file.hash << ". from peer " << ci->PeerId() << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1391,16 +1411,20 @@ int ftServer::handleIncoming()
|
||||||
|
|
||||||
mCacheStrapper->recvCacheResponse(data, time(NULL));
|
mCacheStrapper->recvCacheResponse(data, time(NULL));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
// case RS_PKT_SUBTYPE_FT_CACHE_REQUEST:
|
// case RS_PKT_SUBTYPE_FT_CACHE_REQUEST:
|
||||||
// {
|
// {
|
||||||
// // do nothing
|
// // do nothing
|
||||||
// RsFileTransferCacheRequestItem *cr = dynamic_cast<RsFileTransferCacheRequestItem*>(item) ;
|
// RsFileTransferCacheRequestItem *cr = dynamic_cast<RsFileTransferCacheRequestItem*>(item) ;
|
||||||
|
// if (cr)
|
||||||
|
// {
|
||||||
//#ifdef SERVER_DEBUG_CACHE
|
//#ifdef SERVER_DEBUG_CACHE
|
||||||
// std::cerr << "ftServer::handleIncoming: received cache request from peer " << cr->PeerId() << std::endl;
|
// std::cerr << "ftServer::handleIncoming: received cache request from peer " << cr->PeerId() << std::endl;
|
||||||
//#endif
|
//#endif
|
||||||
// }
|
// }
|
||||||
|
// }
|
||||||
// break ;
|
// break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue