[ox/mc] Fix buffer overrun issues

This commit is contained in:
Gary Talent 2019-11-03 16:42:42 -06:00
parent 7699ae2294
commit 693e7324ed
2 changed files with 15 additions and 16 deletions

View File

@ -95,19 +95,19 @@ Error MetalClawReader::field(const char*, SerStr val) {
}
[[nodiscard]] ValErr<ArrayLength> MetalClawReader::arrayLength(bool pass) {
std::size_t len = 0;
if (m_fieldPresence.get(m_field)) {
// read the length
if (m_buffIt >= m_buffLen) {
return OxError(MC_BUFFENDED);
}
std::size_t bytesRead = 0;
len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead).value;
auto out = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead).value;
if (pass) {
m_buffIt += sizeof(ArrayLength);
m_buffIt += bytesRead;
}
return out;
}
return len;
return OxError(1);
}
[[nodiscard]] StringLength MetalClawReader::stringLength() {

View File

@ -56,11 +56,11 @@ class MetalClawReader {
// array handler, with callback to allow handling individual elements
template<typename T, typename Handler>
Error field(const char*, Handler *val);
Error field(const char*, Handler handler);
// array handler, with callback to allow handling individual elements
template<typename T, typename Handler>
Error field(const char*, Handler *val, ArrayLength len);
Error field(const char*, Handler handler, ArrayLength len);
template<typename T>
Error field(const char*, ox::Vector<T> *val);
@ -132,6 +132,7 @@ Error MetalClawReader::readInteger(I *val) {
if (m_fieldPresence.get(m_field++)) {
std::size_t bytesRead = 0;
if (m_buffIt >= m_buffLen) {
oxTrace("ox::MetalClaw::readInteger") << "Buffer ended";
return OxError(MC_BUFFENDED);
}
auto valErr = mc::decodeInteger<I>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
@ -173,23 +174,21 @@ Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) {
}
template<typename T, typename Handler>
Error MetalClawReader::field(const char *name, Handler *handler) {
auto [arrayLen, err] = arrayLength(true);
oxReturnError(err);
return field(name, handler, arrayLen);
}
template<typename T, typename Handler>
Error MetalClawReader::field(const char*, Handler *handler, ArrayLength len) {
Error MetalClawReader::field(const char*, Handler handler) {
if (m_fieldPresence.get(m_field++)) {
// read the length
if (m_buffIt >= m_buffLen) {
return OxError(MC_BUFFENDED);
}
std::size_t bytesRead = 0;
auto len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
m_buffIt += bytesRead;
oxReturnError(len.error);
// read the list
auto reader = child();
reader.setTypeInfo("List", len);
for (std::size_t i = 0; i < len; i++) {
reader.setTypeInfo("List", len.value);
for (std::size_t i = 0; i < len.value; i++) {
T val;
oxReturnError(reader.field("", &val));
oxReturnError(handler(i, &val));