[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) {
|
[[nodiscard]] ValErr<ArrayLength> MetalClawReader::arrayLength(bool pass) {
|
||||||
std::size_t len = 0;
|
|
||||||
if (m_fieldPresence.get(m_field)) {
|
if (m_fieldPresence.get(m_field)) {
|
||||||
// read the length
|
// read the length
|
||||||
if (m_buffIt >= m_buffLen) {
|
if (m_buffIt >= m_buffLen) {
|
||||||
return OxError(MC_BUFFENDED);
|
return OxError(MC_BUFFENDED);
|
||||||
}
|
}
|
||||||
std::size_t bytesRead = 0;
|
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) {
|
if (pass) {
|
||||||
m_buffIt += sizeof(ArrayLength);
|
m_buffIt += bytesRead;
|
||||||
}
|
}
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
return len;
|
return OxError(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] StringLength MetalClawReader::stringLength() {
|
[[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
|
// array handler, with callback to allow handling individual elements
|
||||||
template<typename T, typename Handler>
|
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
|
// array handler, with callback to allow handling individual elements
|
||||||
template<typename T, typename Handler>
|
template<typename T, typename Handler>
|
||||||
Error field(const char*, Handler *val, ArrayLength len);
|
Error field(const char*, Handler handler, ArrayLength len);
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Error field(const char*, ox::Vector<T> *val);
|
Error field(const char*, ox::Vector<T> *val);
|
||||||
@ -132,6 +132,7 @@ Error MetalClawReader::readInteger(I *val) {
|
|||||||
if (m_fieldPresence.get(m_field++)) {
|
if (m_fieldPresence.get(m_field++)) {
|
||||||
std::size_t bytesRead = 0;
|
std::size_t bytesRead = 0;
|
||||||
if (m_buffIt >= m_buffLen) {
|
if (m_buffIt >= m_buffLen) {
|
||||||
|
oxTrace("ox::MetalClaw::readInteger") << "Buffer ended";
|
||||||
return OxError(MC_BUFFENDED);
|
return OxError(MC_BUFFENDED);
|
||||||
}
|
}
|
||||||
auto valErr = mc::decodeInteger<I>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
|
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>
|
template<typename T, typename Handler>
|
||||||
Error MetalClawReader::field(const char *name, Handler *handler) {
|
Error MetalClawReader::field(const char*, 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) {
|
|
||||||
if (m_fieldPresence.get(m_field++)) {
|
if (m_fieldPresence.get(m_field++)) {
|
||||||
// read the length
|
// read the length
|
||||||
if (m_buffIt >= m_buffLen) {
|
if (m_buffIt >= m_buffLen) {
|
||||||
return OxError(MC_BUFFENDED);
|
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
|
// read the list
|
||||||
auto reader = child();
|
auto reader = child();
|
||||||
reader.setTypeInfo("List", len);
|
reader.setTypeInfo("List", len.value);
|
||||||
for (std::size_t i = 0; i < len; i++) {
|
for (std::size_t i = 0; i < len.value; i++) {
|
||||||
T val;
|
T val;
|
||||||
oxReturnError(reader.field("", &val));
|
oxReturnError(reader.field("", &val));
|
||||||
oxReturnError(handler(i, &val));
|
oxReturnError(handler(i, &val));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user