Allow loading packets of large size from config files (fixed storing of big messages), and continue on config files skipping items that cannot be deserialised (Modified patch from Phenom)

git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@7040 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
csoler 2014-01-19 14:29:29 +00:00
parent 037abea5eb
commit 07239883c8
2 changed files with 53 additions and 52 deletions

View File

@ -66,6 +66,7 @@ pqistore::pqistore(RsSerialiser *rss, const std::string &srcId, BinInterface *bi
exit(1); exit(1);
} }
bStopReading=false;
return; return;
} }
@ -127,12 +128,12 @@ RsItem *pqistore::GetItem()
pqioutput(PQL_DEBUG_ALL, pqistorezone, "pqistore::GetItem()"); pqioutput(PQL_DEBUG_ALL, pqistorezone, "pqistore::GetItem()");
#endif #endif
bStopReading=false;
// check if this is a reading bio. // check if this is a reading bio.
if (!(bio_flags & BIN_FLAGS_READABLE)) if (!(bio_flags & BIN_FLAGS_READABLE))
{ {
#ifdef PQISTORE_DEBUG
pqioutput(PQL_DEBUG_BASIC, pqistorezone, "pqistore::GetItem() Error Not Readable"); pqioutput(PQL_DEBUG_BASIC, pqistorezone, "pqistore::GetItem() Error Not Readable");
#endif bStopReading=true;
return NULL; return NULL;
} }
@ -154,7 +155,8 @@ RsItem *pqistore::GetItem()
#ifdef PQISTORE_DEBUG #ifdef PQISTORE_DEBUG
if (outPkt != NULL) if (outPkt != NULL)
{ {
std::string out = "pqistore::GetItem() Returning:\n"; std::string out;
rs_sprintf(out, "pqistore::GetItem() Returning:\n");
outPkt -> print(out); outPkt -> print(out);
pqioutput(PQL_DEBUG_BASIC, pqistorezone, out); pqioutput(PQL_DEBUG_BASIC, pqistorezone, out);
} }
@ -277,18 +279,17 @@ int pqistore::readPkt(RsItem **item_out)
#ifdef PQISTORE_DEBUG #ifdef PQISTORE_DEBUG
pqioutput(PQL_DEBUG_ALL, pqistorezone, "pqistore::readPkt()"); pqioutput(PQL_DEBUG_ALL, pqistorezone, "pqistore::readPkt()");
#endif #endif
bStopReading = false ;
if ((!(bio->isactive())) || (!(bio->moretoread()))) if ((!(bio->isactive())) || (!(bio->moretoread())))
{ {
bStopReading = true ;
return 0; return 0;
} }
// enough space to read any packet.
int maxlen = getRsPktMaxSize();
void *block = malloc(maxlen);
// initial read size: basic packet. // initial read size: basic packet.
int blen = getRsPktBaseSize(); int blen = getRsPktBaseSize();
void *block = malloc(blen);
int tmplen; int tmplen;
/* we have the header */ /* we have the header */
@ -299,28 +300,29 @@ int pqistore::readPkt(RsItem **item_out)
pqioutput(PQL_WARNING, pqistorezone, "pqistore::readPkt() bad read(2)"); pqioutput(PQL_WARNING, pqistorezone, "pqistore::readPkt() bad read(2)");
free(block); free(block);
bStopReading=true;
return 0; return 0;
} }
// workout how much more to read. // workout how much more to read.
int extralen = getRsItemSize(block) - blen; int extralen = getRsItemSize(block) - blen;
int totallen = extralen+blen;
void *tmp = realloc(block, totallen);
if(extralen+blen > maxlen) if (tmp == NULL)
{ {
free(block) ; free(block);
std::cerr << "***** ERROR: trying to read a packet of length " << extralen+blen << ", while the maximum length is " << maxlen << std::endl ; std::cerr << "pqistore: ERROR: trying to realloc memory for packet of length" << extralen+blen << std::endl ;
std::cerr << "Have you got enought memory?" << std::endl ;
bStopReading=true;
return 0 ; return 0 ;
} }
else
block = tmp;
if (extralen > 0) if (extralen > 0)
{ {
if(extralen > blen + maxlen)
{
std::cerr << "pqistore: ERROR: Inconsistency in packet format (extralen=" << extralen << ", maxlen=" << maxlen << "). Wasting the whole file." << std::endl ;
free(block) ;
return 0 ;
}
void *extradata = (void *) (((char *) block) + blen); void *extradata = (void *) (((char *) block) + blen);
if (extralen != (tmplen = bio->readdata(extradata, extralen))) if (extralen != (tmplen = bio->readdata(extradata, extralen)))
@ -328,6 +330,7 @@ int pqistore::readPkt(RsItem **item_out)
std::string out; std::string out;
rs_sprintf(out, "pqistore::readPkt() Error Completing Read (read %d/%d)", tmplen, extralen); rs_sprintf(out, "pqistore::readPkt() Error Completing Read (read %d/%d)", tmplen, extralen);
pqioutput(PQL_ALERT, pqistorezone, out); pqioutput(PQL_ALERT, pqistorezone, out);
bStopReading=true;
free(block); free(block);
return 0; return 0;
@ -335,8 +338,6 @@ int pqistore::readPkt(RsItem **item_out)
} }
// create packet, based on header. // create packet, based on header.
//std::cerr << "Read Data Block -> Incoming Pkt(";
//std::cerr << blen + extralen << ")" << std::endl;
uint32_t readbytes = extralen + blen; uint32_t readbytes = extralen + blen;
RsItem *item = rsSerialiser->deserialise(block, &readbytes); RsItem *item = rsSerialiser->deserialise(block, &readbytes);
@ -362,6 +363,7 @@ std::string pqistore::gethash()
pqiSSLstore::pqiSSLstore(RsSerialiser *rss, std::string srcId, BinEncryptedFileInterface* bio_in, int bio_flagsin) pqiSSLstore::pqiSSLstore(RsSerialiser *rss, std::string srcId, BinEncryptedFileInterface* bio_in, int bio_flagsin)
: pqistore(rss, srcId, bio_in, bio_flagsin), enc_bio(bio_in) : pqistore(rss, srcId, bio_in, bio_flagsin), enc_bio(bio_in)
{ {
bStopReading=false;
return; return;
} }
@ -413,15 +415,14 @@ bool pqiSSLstore::encryptedSendItems(const std::list<RsItem*>& rsItemList)
bool pqiSSLstore::getEncryptedItems(std::list<RsItem* >& rsItemList) bool pqiSSLstore::getEncryptedItems(std::list<RsItem* >& rsItemList)
{ {
RsItem* item; RsItem* item;
bStopReading=false;
do do
{ {
if (NULL != (item = GetItem())) if (NULL != (item = GetItem()))
rsItemList.push_back(item); rsItemList.push_back(item);
else
break ;
} while (enc_bio->isactive() && enc_bio->moretoread()); } while (enc_bio->isactive() && enc_bio->moretoread() && !bStopReading);
return true; return true;
} }
@ -430,13 +431,15 @@ bool pqiSSLstore::getEncryptedItems(std::list<RsItem* >& rsItemList)
RsItem *pqiSSLstore::GetItem() RsItem *pqiSSLstore::GetItem()
{ {
#ifdef PQISTORE_DEBUG #ifdef PQISTORE_DEBUG
pqioutput(PQL_DEBUG_ALL, pqistorezone, "pqistore::GetItem()"); pqioutput(PQL_DEBUG_ALL, pqistorezone, "pqiSSLstore::GetItem()");
#endif #endif
bStopReading=false;
// check if this is a reading bio. // check if this is a reading bio.
if (!(bio_flags & BIN_FLAGS_READABLE)) if (!(bio_flags & BIN_FLAGS_READABLE))
{ {
pqioutput(PQL_DEBUG_BASIC, pqistorezone, "pqistore::GetItem() Error Not Readable"); pqioutput(PQL_DEBUG_BASIC, pqistorezone, "pqiSSLstore::GetItem() Error Not Readable");
bStopReading=true;
return NULL; return NULL;
} }
@ -445,7 +448,7 @@ RsItem *pqiSSLstore::GetItem()
{ {
if (!readPkt(&nextPkt)) if (!readPkt(&nextPkt))
{ {
pqioutput(PQL_DEBUG_BASIC, pqistorezone, "pqistore::GetItem() Failed to ReadPkt"); pqioutput(PQL_DEBUG_BASIC, pqistorezone, "pqiSSLstore::GetItem() Failed to ReadPkt");
return NULL; return NULL;
} }
} }
@ -459,7 +462,7 @@ RsItem *pqiSSLstore::GetItem()
if (outPkt != NULL) if (outPkt != NULL)
{ {
std::string out; std::string out;
rs_sprintf(out, "pqistore::GetItem() Returning:\n"); rs_sprintf(out, "pqiSSLstore::GetItem() Returning:\n");
outPkt -> print(out); outPkt -> print(out);
pqioutput(PQL_DEBUG_BASIC, pqistorezone, out); pqioutput(PQL_DEBUG_BASIC, pqistorezone, out);
} }
@ -470,21 +473,21 @@ RsItem *pqiSSLstore::GetItem()
int pqiSSLstore::readPkt(RsItem **item_out) int pqiSSLstore::readPkt(RsItem **item_out)
{ {
*item_out = NULL ;
#ifdef PQISTORE_DEBUG #ifdef PQISTORE_DEBUG
pqioutput(PQL_DEBUG_ALL, pqistorezone, "pqistore::readPkt()"); pqioutput(PQL_DEBUG_ALL, pqistorezone, "pqistore::readPkt()");
#endif #endif
bStopReading=false ;
if ((!(enc_bio->isactive())) || (!(enc_bio->moretoread()))) if ((!(enc_bio->isactive())) || (!(enc_bio->moretoread())))
{ {
bStopReading=true ;
return 0; return 0;
} }
// enough space to read any packet.
int maxlen = getRsPktMaxSize();
void *block = malloc(maxlen);
// initial read size: basic packet. // initial read size: basic packet.
int blen = getRsPktBaseSize(); int blen = getRsPktBaseSize();
void *block = malloc(blen);
int tmplen; int tmplen;
/* we have the header */ /* we have the header */
@ -492,48 +495,45 @@ int pqiSSLstore::readPkt(RsItem **item_out)
// read the basic block (minimum packet size) // read the basic block (minimum packet size)
if (blen != (tmplen = enc_bio->readdata(block, blen))) if (blen != (tmplen = enc_bio->readdata(block, blen)))
{ {
pqioutput(PQL_WARNING, pqistorezone, pqioutput(PQL_WARNING, pqistorezone, "pqiSSLstore::readPkt() bad read(2)");
"pqistore::readPkt() bad read(2)");
free(block); free(block);
bStopReading=true;
return 0; return 0;
} }
// workout how much more to read. // workout how much more to read.
int extralen = getRsItemSize(block) - blen; int extralen = getRsItemSize(block) - blen;
int totallen = extralen+blen;
if(extralen+blen > maxlen) void *tmp = realloc(block, totallen);
{ if (tmp == NULL) {
free(block) ; free(block);
std::cerr << "***** ERROR: trying to read a packet of length " << extralen+blen << ", while the maximum length is " << maxlen << std::endl ; std::cerr << "pqiSSLstore: ERROR: trying to realloc memory for packet of length" << extralen+blen << std::endl ;
std::cerr << "Have you got enought memory?" << std::endl ;
bStopReading=true;
return 0 ; return 0 ;
} }
else
block = tmp;
if (extralen > 0) if (extralen > 0)
{ {
if(extralen > blen + maxlen)
{
std::cerr << "pqistore: ERROR: Inconsistency in packet format (extralen=" << extralen << ", maxlen=" << maxlen << "). Wasting the whole file." << std::endl ;
free(block) ;
return 0 ;
}
void *extradata = (void *) (((char *) block) + blen); void *extradata = (void *) (((char *) block) + blen);
if (extralen != (tmplen = enc_bio->readdata(extradata, extralen))) if (extralen != (tmplen = enc_bio->readdata(extradata, extralen)))
{ {
std::string out; std::string out;
rs_sprintf(out, "pqistore::readPkt() Error Completing Read (read %d/%d)", tmplen, extralen); rs_sprintf(out, "pqiSSLstore::readPkt() Error Completing Read (read %d/%d)", tmplen, extralen);
pqioutput(PQL_ALERT, pqistorezone, out); pqioutput(PQL_ALERT, pqistorezone, out);
free(block); free(block);
bStopReading=true;
return 0; return 0;
} }
} }
// create packet, based on header. // create packet, based on header.
//std::cerr << "Read Data Block -> Incoming Pkt(";
//std::cerr << blen + extralen << ")" << std::endl;
uint32_t readbytes = extralen + blen; uint32_t readbytes = extralen + blen;
RsItem *item = rsSerialiser->deserialise(block, &readbytes); RsItem *item = rsSerialiser->deserialise(block, &readbytes);
@ -541,10 +541,7 @@ int pqiSSLstore::readPkt(RsItem **item_out)
if (item == NULL) if (item == NULL)
{ {
#ifdef PQISTORE_DEBUG pqioutput(PQL_ALERT, pqistorezone, "pqiSSLstore::readPkt() Failed to create Item from store!");
pqioutput(PQL_ALERT, pqistorezone,
"pqistore::readPkt() Failed to create Item from store!");
#endif
return 0; return 0;
} }
@ -552,3 +549,4 @@ int pqiSSLstore::readPkt(RsItem **item_out)
*item_out = item; *item_out = item;
return 1; return 1;
} }

View File

@ -53,6 +53,8 @@ virtual int status();
std::string gethash(); std::string gethash();
bool bStopReading;
protected: protected:
// Serialiser // Serialiser
@ -105,6 +107,7 @@ private:
BinEncryptedFileInterface* enc_bio; BinEncryptedFileInterface* enc_bio;
//bool bStopReading;
}; };