summaryrefslogtreecommitdiff
path: root/tools/source
diff options
context:
space:
mode:
authorSzymon Kłos <szymon.klos@collabora.com>2021-12-08 11:53:35 +0100
committerAndras Timar <andras.timar@collabora.com>2022-02-14 11:25:40 +0100
commitb1cd29c42e47a434bdb54b744f9db711ac5ef95d (patch)
tree0d413e3da1dcbe6756fe33f97db0564a2a50e954 /tools/source
parent05bac006ea18bcbc24a86035664f096787fff613 (diff)
jsonwriter: ensure correct number of bytes is available
In some functions author forgot that addCommaBeforeField() can add additional two characters. I didn't change cases where more bytes than needed are requested. Additional change is that in debug mode there is a marker at the end of allocated buffer - we check that after every write to detect overflow. No need to request more space for a marker as we always allocate "needed size * 2". Change-Id: I28066797b0ba833e408b0a731abc01b7fd989da3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126535 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129163 Tested-by: Jenkins Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Diffstat (limited to 'tools/source')
-rw-r--r--tools/source/misc/json_writer.cxx39
1 files changed, 37 insertions, 2 deletions
diff --git a/tools/source/misc/json_writer.cxx b/tools/source/misc/json_writer.cxx
index d6e34179f930..7730a9a603d5 100644
--- a/tools/source/misc/json_writer.cxx
+++ b/tools/source/misc/json_writer.cxx
@@ -30,6 +30,8 @@ JsonWriter::JsonWriter()
++mPos;
*mPos = ' ';
++mPos;
+
+ addValidationMark();
}
JsonWriter::~JsonWriter()
@@ -41,7 +43,7 @@ JsonWriter::~JsonWriter()
ScopedJsonWriterNode JsonWriter::startNode(const char* pNodeName)
{
auto len = strlen(pNodeName);
- ensureSpace(len + 6);
+ ensureSpace(len + 8);
addCommaBeforeField();
@@ -53,6 +55,9 @@ ScopedJsonWriterNode JsonWriter::startNode(const char* pNodeName)
mPos += 5;
mStartNodeCount++;
mbFirstFieldInNode = true;
+
+ validate();
+
return ScopedJsonWriterNode(*this);
}
@@ -64,12 +69,14 @@ void JsonWriter::endNode()
*mPos = '}';
++mPos;
mbFirstFieldInNode = false;
+
+ validate();
}
ScopedJsonWriterArray JsonWriter::startArray(const char* pNodeName)
{
auto len = strlen(pNodeName);
- ensureSpace(len + 6);
+ ensureSpace(len + 8);
addCommaBeforeField();
@@ -81,6 +88,9 @@ ScopedJsonWriterArray JsonWriter::startArray(const char* pNodeName)
mPos += 5;
mStartNodeCount++;
mbFirstFieldInNode = true;
+
+ validate();
+
return ScopedJsonWriterArray(*this);
}
@@ -92,6 +102,8 @@ void JsonWriter::endArray()
*mPos = ']';
++mPos;
mbFirstFieldInNode = false;
+
+ validate();
}
ScopedJsonWriterStruct JsonWriter::startStruct()
@@ -106,6 +118,9 @@ ScopedJsonWriterStruct JsonWriter::startStruct()
++mPos;
mStartNodeCount++;
mbFirstFieldInNode = true;
+
+ validate();
+
return ScopedJsonWriterStruct(*this);
}
@@ -117,6 +132,8 @@ void JsonWriter::endStruct()
*mPos = '}';
++mPos;
mbFirstFieldInNode = false;
+
+ validate();
}
static char getEscapementChar(char ch)
@@ -211,6 +228,8 @@ void JsonWriter::writeEscapedOUString(const OUString& rPropVal)
++mPos;
}
}
+
+ validate();
}
void JsonWriter::put(const char* pPropName, const OUString& rPropVal)
@@ -234,6 +253,8 @@ void JsonWriter::put(const char* pPropName, const OUString& rPropVal)
*mPos = '"';
++mPos;
+
+ validate();
}
void JsonWriter::put(const char* pPropName, std::string_view rPropVal)
@@ -287,6 +308,8 @@ void JsonWriter::put(const char* pPropName, std::string_view rPropVal)
*mPos = '"';
++mPos;
+
+ validate();
}
void JsonWriter::put(const char* pPropName, sal_Int64 nPropVal)
@@ -305,6 +328,8 @@ void JsonWriter::put(const char* pPropName, sal_Int64 nPropVal)
mPos += 3;
mPos += sprintf(mPos, "%" SAL_PRIdINT64, nPropVal);
+
+ validate();
}
void JsonWriter::put(const char* pPropName, double fPropVal)
@@ -324,6 +349,8 @@ void JsonWriter::put(const char* pPropName, double fPropVal)
memcpy(mPos, sPropVal.getStr(), sPropVal.getLength());
mPos += sPropVal.getLength();
+
+ validate();
}
void JsonWriter::put(const char* pPropName, bool nPropVal)
@@ -347,6 +374,8 @@ void JsonWriter::put(const char* pPropName, bool nPropVal)
pVal = "false";
memcpy(mPos, pVal, strlen(pVal));
mPos += strlen(pVal);
+
+ validate();
}
void JsonWriter::putSimpleValue(const OUString& rPropVal)
@@ -363,6 +392,8 @@ void JsonWriter::putSimpleValue(const OUString& rPropVal)
*mPos = '"';
++mPos;
+
+ validate();
}
void JsonWriter::putRaw(std::string_view rRawBuf)
@@ -373,6 +404,8 @@ void JsonWriter::putRaw(std::string_view rRawBuf)
memcpy(mPos, rRawBuf.data(), rRawBuf.size());
mPos += rRawBuf.size();
+
+ validate();
}
void JsonWriter::addCommaBeforeField()
@@ -398,6 +431,8 @@ void JsonWriter::ensureSpace(int noMoreBytesRequired)
mpBuffer = static_cast<char*>(realloc(mpBuffer, newSize));
mPos = mpBuffer + currentUsed;
mSpaceAllocated = newSize;
+
+ addValidationMark();
}
}