- hotfix for a RapidJSON bug: If the Writer tries to process an INF or NaN value, it aborts and leaves the writer in a broken state, unable to recover. Changed so that it writes a 0 value so that the resulting JSON at least parses correctly.

This commit is contained in:
Christoph Oelckers 2016-10-02 18:50:37 +02:00
parent 3418710a38
commit 37d61167ea
2 changed files with 27 additions and 19 deletions

View file

@ -322,22 +322,30 @@ protected:
bool WriteDouble(double d) {
if (internal::Double(d).IsNanOrInf()) {
if (!(writeFlags & kWriteNanAndInfFlag))
return false;
if (internal::Double(d).IsNan()) {
PutReserve(*os_, 3);
PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N');
return true;
}
if (internal::Double(d).Sign()) {
PutReserve(*os_, 9);
PutUnsafe(*os_, '-');
}
else
PutReserve(*os_, 8);
PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f');
PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y');
return true;
bool ret = true;
if (!(writeFlags & kWriteNanAndInfFlag))
{
// if we abort here, the writer is left in a broken state, unable to recover, so better write a 0 in addition to returning an error.
ret = false;
d = 0;
}
else
{
if (internal::Double(d).IsNan()) {
PutReserve(*os_, 3);
PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N');
return true;
}
if (internal::Double(d).Sign()) {
PutReserve(*os_, 9);
PutUnsafe(*os_, '-');
}
else
PutReserve(*os_, 8);
PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f');
PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y');
return true;
}
}
char buffer[25];
@ -345,7 +353,7 @@ protected:
PutReserve(*os_, static_cast<size_t>(end - buffer));
for (char* p = buffer; p != end; ++p)
PutUnsafe(*os_, static_cast<typename TargetEncoding::Ch>(*p));
return true;
return ret;
}
bool WriteString(const Ch* str, SizeType length) {

View file

@ -217,11 +217,11 @@ struct FWriter
{
if (mWriter1)
{
if (!mWriter1->Double(k)) mWriter1->Double(0);
mWriter1->Double(k);
}
else if (mWriter2)
{
if (!mWriter2->Double(k)) mWriter2->Double(0);
mWriter2->Double(k);
}
}