mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-12-20 05:14:25 -05:00
yet another uninitialized memory read gone
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@1067 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
24c841ffe3
commit
cc993dab25
@ -191,6 +191,7 @@ RsItem *pqistreamer::GetItem()
|
|||||||
// // PQInterface
|
// // PQInterface
|
||||||
int pqistreamer::tick()
|
int pqistreamer::tick()
|
||||||
{
|
{
|
||||||
|
// std::cerr << "enterign tick, state = " << reading_state << std::endl ;
|
||||||
{
|
{
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
out << "pqistreamer::tick()";
|
out << "pqistreamer::tick()";
|
||||||
@ -201,7 +202,9 @@ int pqistreamer::tick()
|
|||||||
pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str());
|
pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// std::cerr << "calling bio-> tick, state = " << reading_state << std::endl ;
|
||||||
bio->tick();
|
bio->tick();
|
||||||
|
// std::cerr << "after bio-> tick, state = " << reading_state << std::endl ;
|
||||||
|
|
||||||
/* short circuit everything is bio isn't active */
|
/* short circuit everything is bio isn't active */
|
||||||
if (!(bio->isactive()))
|
if (!(bio->isactive()))
|
||||||
@ -214,8 +217,11 @@ int pqistreamer::tick()
|
|||||||
* that incoming will not
|
* that incoming will not
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// std::cerr << "calling handle incoming, state = " << reading_state << std::endl ;
|
||||||
handleincoming();
|
handleincoming();
|
||||||
|
// std::cerr << "returned from handle incoming, state = " << reading_state << std::endl ;
|
||||||
handleoutgoing();
|
handleoutgoing();
|
||||||
|
// std::cerr << "returned from handle outgoing, state = " << reading_state << std::endl ;
|
||||||
|
|
||||||
/* give details of the packets */
|
/* give details of the packets */
|
||||||
{
|
{
|
||||||
@ -611,8 +617,8 @@ int pqistreamer::handleincoming()
|
|||||||
msgout << "\n";
|
msgout << "\n";
|
||||||
|
|
||||||
std::string msg = msgout.str();
|
std::string msg = msgout.str();
|
||||||
std::cout << msg << std::endl ;
|
std::cerr << msg << std::endl ;
|
||||||
std::cout << "block = "
|
std::cerr << "block = "
|
||||||
<< (int)(((unsigned char*)block)[0]) << " "
|
<< (int)(((unsigned char*)block)[0]) << " "
|
||||||
<< (int)(((unsigned char*)block)[1]) << " "
|
<< (int)(((unsigned char*)block)[1]) << " "
|
||||||
<< (int)(((unsigned char*)block)[2]) << " "
|
<< (int)(((unsigned char*)block)[2]) << " "
|
||||||
@ -671,7 +677,7 @@ int pqistreamer::handleincoming()
|
|||||||
int pqistreamer::handleincoming()
|
int pqistreamer::handleincoming()
|
||||||
{
|
{
|
||||||
int readbytes = 0;
|
int readbytes = 0;
|
||||||
static const int max_failed_read_attempts = 100 ;
|
static const int max_failed_read_attempts = 600 ;
|
||||||
|
|
||||||
{
|
{
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
@ -682,6 +688,7 @@ int pqistreamer::handleincoming()
|
|||||||
if(!(bio->isactive()))
|
if(!(bio->isactive()))
|
||||||
{
|
{
|
||||||
reading_state = reading_state_initial ;
|
reading_state = reading_state_initial ;
|
||||||
|
inReadBytes(readbytes);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -694,26 +701,32 @@ int pqistreamer::handleincoming()
|
|||||||
|
|
||||||
int maxin = inAllowedBytes();
|
int maxin = inAllowedBytes();
|
||||||
|
|
||||||
|
// std::cerr << "reading state = " << reading_state << std::endl ;
|
||||||
switch(reading_state)
|
switch(reading_state)
|
||||||
{
|
{
|
||||||
case reading_state_initial: goto start_packet_read ;
|
case reading_state_initial: /*std::cerr << "jumping to start" << std::endl; */ goto start_packet_read ;
|
||||||
case reading_state_packet_started: goto continue_packet ;
|
case reading_state_packet_started: /*std::cerr << "jumping to middle" << std::endl;*/ goto continue_packet ;
|
||||||
}
|
}
|
||||||
|
|
||||||
start_packet_read:
|
start_packet_read:
|
||||||
{ // scope to ensure variable visibility
|
{ // scope to ensure variable visibility
|
||||||
// read the basic block (minimum packet size)
|
// read the basic block (minimum packet size)
|
||||||
int tmplen;
|
int tmplen;
|
||||||
|
// std::cerr << "starting packet" << std::endl ;
|
||||||
|
memset(block,0,blen) ; // reset the block, to avoid uninitialized memory reads.
|
||||||
|
|
||||||
if (blen != (tmplen = bio->readdata(block, blen)))
|
if (blen != (tmplen = bio->readdata(block, blen)))
|
||||||
{
|
{
|
||||||
pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, "pqistreamer::handleincoming() Didn't read BasePkt!");
|
pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, "pqistreamer::handleincoming() Didn't read BasePkt!");
|
||||||
|
|
||||||
|
inReadBytes(readbytes);
|
||||||
|
|
||||||
// error.... (either blocked or failure)
|
// error.... (either blocked or failure)
|
||||||
if (tmplen == 0)
|
if (tmplen == 0)
|
||||||
{
|
{
|
||||||
// most likely blocked!
|
// most likely blocked!
|
||||||
pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, "pqistreamer::handleincoming() read blocked");
|
pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, "pqistreamer::handleincoming() read blocked");
|
||||||
|
// std::cerr << "given up 1" << std::endl ;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (tmplen < 0)
|
else if (tmplen < 0)
|
||||||
@ -722,6 +735,7 @@ start_packet_read:
|
|||||||
// So we return without an error, and leave the machine state in 'start_read'.
|
// So we return without an error, and leave the machine state in 'start_read'.
|
||||||
//
|
//
|
||||||
pqioutput(PQL_WARNING, pqistreamerzone, "pqistreamer::handleincoming() Error in bio read");
|
pqioutput(PQL_WARNING, pqistreamerzone, "pqistreamer::handleincoming() Error in bio read");
|
||||||
|
// std::cerr << "given up 2, state = " << reading_state << std::endl ;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else // tmplen > 0
|
else // tmplen > 0
|
||||||
@ -731,9 +745,15 @@ start_packet_read:
|
|||||||
out << "pqistreamer::handleincoming() Incomplete ";
|
out << "pqistreamer::handleincoming() Incomplete ";
|
||||||
out << "(Strange) read of " << tmplen << " bytes";
|
out << "(Strange) read of " << tmplen << " bytes";
|
||||||
pqioutput(PQL_ALERT, pqistreamerzone, out.str());
|
pqioutput(PQL_ALERT, pqistreamerzone, out.str());
|
||||||
|
// std::cerr << "given up 3" << std::endl ;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// std::cerr << "block 0 : " << (int)(((unsigned char*)block)[0]) << " " << (int)(((unsigned char*)block)[1]) << " " << (int)(((unsigned char*)block)[2]) << " " << (int)(((unsigned char*)block)[3])
|
||||||
|
// << (int)(((unsigned char*)block)[4]) << " "
|
||||||
|
// << (int)(((unsigned char*)block)[5]) << " "
|
||||||
|
// << (int)(((unsigned char*)block)[6]) << " "
|
||||||
|
// << (int)(((unsigned char*)block)[7]) << " " << std::endl ;
|
||||||
|
|
||||||
readbytes += blen;
|
readbytes += blen;
|
||||||
reading_state = reading_state_packet_started ;
|
reading_state = reading_state_packet_started ;
|
||||||
@ -744,6 +764,12 @@ continue_packet:
|
|||||||
// workout how much more to read.
|
// workout how much more to read.
|
||||||
int extralen = getRsItemSize(block) - blen;
|
int extralen = getRsItemSize(block) - blen;
|
||||||
|
|
||||||
|
// std::cerr << "continuing packet state=" << reading_state << std::endl ;
|
||||||
|
// std::cerr << "block 1 : " << (int)(((unsigned char*)block)[0]) << " " << (int)(((unsigned char*)block)[1]) << " " << (int)(((unsigned char*)block)[2]) << " " << (int)(((unsigned char*)block)[3])
|
||||||
|
// << (int)(((unsigned char*)block)[4]) << " "
|
||||||
|
// << (int)(((unsigned char*)block)[5]) << " "
|
||||||
|
// << (int)(((unsigned char*)block)[6]) << " "
|
||||||
|
// << (int)(((unsigned char*)block)[7]) << " " << std::endl ;
|
||||||
if (extralen > maxlen - blen)
|
if (extralen > maxlen - blen)
|
||||||
{
|
{
|
||||||
pqioutput(PQL_ALERT, pqistreamerzone, "ERROR: Read Packet too Big!");
|
pqioutput(PQL_ALERT, pqistreamerzone, "ERROR: Read Packet too Big!");
|
||||||
@ -792,6 +818,7 @@ continue_packet:
|
|||||||
{
|
{
|
||||||
void *extradata = (void *) (((char *) block) + blen);
|
void *extradata = (void *) (((char *) block) + blen);
|
||||||
int tmplen ;
|
int tmplen ;
|
||||||
|
memset((void*)( &(((unsigned char *)block)[blen])),0,extralen) ; // reset the block, to avoid uninitialized memory reads.
|
||||||
|
|
||||||
memset( extradata,0,extralen ) ; // for checking later
|
memset( extradata,0,extralen ) ; // for checking later
|
||||||
|
|
||||||
@ -824,12 +851,17 @@ continue_packet:
|
|||||||
msgout << "\n";
|
msgout << "\n";
|
||||||
|
|
||||||
std::string msg = msgout.str();
|
std::string msg = msgout.str();
|
||||||
std::cout << msg << std::endl ;
|
std::cerr << msg << std::endl ;
|
||||||
std::cout << "block = "
|
std::cerr << "block = "
|
||||||
<< (int)(((unsigned char*)block)[0]) << " "
|
<< (int)(((unsigned char*)block)[0]) << " "
|
||||||
<< (int)(((unsigned char*)block)[1]) << " "
|
<< (int)(((unsigned char*)block)[1]) << " "
|
||||||
<< (int)(((unsigned char*)block)[2]) << " "
|
<< (int)(((unsigned char*)block)[2]) << " "
|
||||||
<< (int)(((unsigned char*)block)[3]) << std::endl ;
|
<< (int)(((unsigned char*)block)[3]) << " "
|
||||||
|
<< (int)(((unsigned char*)block)[4]) << " "
|
||||||
|
<< (int)(((unsigned char*)block)[5]) << " "
|
||||||
|
<< (int)(((unsigned char*)block)[6]) << " "
|
||||||
|
<< (int)(((unsigned char*)block)[7]) << " "
|
||||||
|
<< std::endl ;
|
||||||
// notify->AddSysMessage(0, RS_SYS_WARNING, title, msg);
|
// notify->AddSysMessage(0, RS_SYS_WARNING, title, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -839,8 +871,11 @@ continue_packet:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
// std::cerr << "given up 5, state = " << reading_state << std::endl ;
|
||||||
return 0 ; // this is just a SSL_WANT_READ error. Don't panic, we'll re-try the read soon.
|
return 0 ; // this is just a SSL_WANT_READ error. Don't panic, we'll re-try the read soon.
|
||||||
// we assume readdata() returned either -1 or the complete read size.
|
// we assume readdata() returned either -1 or the complete read size.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
readbytes += extralen;
|
readbytes += extralen;
|
||||||
@ -858,8 +893,16 @@ continue_packet:
|
|||||||
// std::cerr << "Deserializing packet of size " << pktlen <<std::endl ;
|
// std::cerr << "Deserializing packet of size " << pktlen <<std::endl ;
|
||||||
|
|
||||||
uint32_t pktlen = blen+extralen ;
|
uint32_t pktlen = blen+extralen ;
|
||||||
|
// std::cerr << "deserializing. Size=" << pktlen << std::endl ;
|
||||||
|
|
||||||
|
if(pktlen == 17306)
|
||||||
|
{
|
||||||
|
FILE *f = fopen("dbug.packet.bin","w");
|
||||||
|
fwrite(block,pktlen,1,f) ;
|
||||||
|
fclose(f) ;
|
||||||
|
exit(-1) ;
|
||||||
|
}
|
||||||
RsItem *pkt = rsSerialiser->deserialise(block, &pktlen);
|
RsItem *pkt = rsSerialiser->deserialise(block, &pktlen);
|
||||||
inReadBytes(readbytes);
|
|
||||||
|
|
||||||
if ((pkt != NULL) && (0 < handleincomingitem(pkt)))
|
if ((pkt != NULL) && (0 < handleincomingitem(pkt)))
|
||||||
pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, "Successfully Read a Packet!");
|
pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, "Successfully Read a Packet!");
|
||||||
@ -873,6 +916,7 @@ continue_packet:
|
|||||||
if(maxin > readbytes && bio->moretoread())
|
if(maxin > readbytes && bio->moretoread())
|
||||||
goto start_packet_read ;
|
goto start_packet_read ;
|
||||||
|
|
||||||
|
inReadBytes(readbytes);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user