[ox/mc] Fix buffer overrun issues
This commit is contained in:
parent
7699ae2294
commit
693e7324ed
8
deps/ox/src/ox/mc/read.cpp
vendored
8
deps/ox/src/ox/mc/read.cpp
vendored
@ -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() {
|
||||
|
23
deps/ox/src/ox/mc/read.hpp
vendored
23
deps/ox/src/ox/mc/read.hpp
vendored
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user