[ox/mc] Fix read to resize Vectors before writing to them
This commit is contained in:
		
							
								
								
									
										6
									
								
								deps/ox/src/ox/mc/intops.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								deps/ox/src/ox/mc/intops.hpp
									
									
									
									
										vendored
									
									
								
							| @@ -125,12 +125,12 @@ template<typename I> | ||||
| 	if (bytes == 9) { | ||||
| 		*bytesRead = bytes; | ||||
| 		I out = 0; | ||||
| 		ox_memcpy(&out, &buff[1], sizeof(I)); | ||||
| 		memcpy(&out, &buff[1], sizeof(I)); | ||||
| 		return {LittleEndian<I>(out), OxError(0)}; | ||||
| 	} else if (buffLen >= bytes) { | ||||
| 		*bytesRead = bytes; | ||||
| 		uint64_t decoded = 0; | ||||
| 		ox_memcpy(&decoded, &buff[0], bytes); | ||||
| 		memcpy(&decoded, &buff[0], bytes); | ||||
| 		decoded >>= bytes; | ||||
| 		auto out = static_cast<I>(decoded); | ||||
| 		// move sign bit | ||||
| @@ -142,7 +142,7 @@ template<typename I> | ||||
| 			decoded &= uint64_t(~0) ^ (uint64_t(1) << valBits); | ||||
| 			// set sign | ||||
| 			decoded |= sign << (Bits<I> - 1); | ||||
| 			ox_memcpy(&out, &decoded, sizeof(out)); | ||||
| 			memcpy(&out, &decoded, sizeof(out)); | ||||
| 		} | ||||
| 		return {out, OxError(0)}; | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										6
									
								
								deps/ox/src/ox/mc/read.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								deps/ox/src/ox/mc/read.cpp
									
									
									
									
										vendored
									
									
								
							| @@ -63,7 +63,7 @@ Error MetalClawReader::field(const char*, uint64_t *val) { | ||||
| Error MetalClawReader::field(const char*, bool *val) { | ||||
| 	auto valErr = m_fieldPresence.get(m_field++); | ||||
| 	*val = valErr.value; | ||||
| 	return OxError(valErr.error); | ||||
| 	return valErr.error; | ||||
| } | ||||
|  | ||||
| Error MetalClawReader::field(const char*, SerStr val) { | ||||
| @@ -94,7 +94,7 @@ Error MetalClawReader::field(const char*, SerStr val) { | ||||
| 	return OxError(0); | ||||
| } | ||||
|  | ||||
| [[nodiscard]] ArrayLength MetalClawReader::arrayLength(bool pass) { | ||||
| [[nodiscard]] ValErr<ArrayLength> MetalClawReader::arrayLength(bool pass) { | ||||
| 	std::size_t len = 0; | ||||
| 	if (m_fieldPresence.get(m_field)) { | ||||
| 		// read the length | ||||
| @@ -102,7 +102,7 @@ Error MetalClawReader::field(const char*, SerStr val) { | ||||
| 			return OxError(MC_BUFFENDED); | ||||
| 		} | ||||
| 		std::size_t bytesRead = 0; | ||||
| 		len = mc::decodeInteger<StringLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead).value; | ||||
| 		len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead).value; | ||||
| 		if (pass) { | ||||
| 			m_buffIt += sizeof(ArrayLength); | ||||
| 		} | ||||
|   | ||||
							
								
								
									
										25
									
								
								deps/ox/src/ox/mc/read.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								deps/ox/src/ox/mc/read.hpp
									
									
									
									
										vendored
									
									
								
							| @@ -12,6 +12,7 @@ | ||||
| #include <ox/model/types.hpp> | ||||
| #include <ox/std/byteswap.hpp> | ||||
| #include <ox/std/string.hpp> | ||||
| #include <ox/std/trace.hpp> | ||||
| #include <ox/std/vector.hpp> | ||||
|  | ||||
| #include "err.hpp" | ||||
| @@ -68,7 +69,7 @@ class MetalClawReader { | ||||
| 		 * Reads an array length from the current location in the buffer. | ||||
| 		 * @param pass indicates that the parsing should iterate past the array length | ||||
| 		 */ | ||||
| 		[[nodiscard]] ArrayLength arrayLength(bool pass = true); | ||||
| 		[[nodiscard]] ValErr<ArrayLength> arrayLength(bool pass = true); | ||||
|  | ||||
| 		/** | ||||
| 		 * Reads an string length from the current location in the buffer. | ||||
| @@ -106,12 +107,11 @@ class MetalClawReader { | ||||
|  | ||||
| template<typename T> | ||||
| Error MetalClawReader::field(const char*, T *val) { | ||||
| 	auto err = OxError(0); | ||||
| 	if (val && m_fieldPresence.get(m_field++)) { | ||||
| 		auto reader = child(); | ||||
| 		err |= model(&reader, val); | ||||
| 		oxReturnError(model(&reader, val)); | ||||
| 	} | ||||
| 	return err; | ||||
| 	return OxError(0); | ||||
| } | ||||
|  | ||||
| template<std::size_t L> | ||||
| @@ -138,8 +138,7 @@ Error MetalClawReader::readInteger(I *val) { | ||||
|  | ||||
| // array handler | ||||
| template<typename T> | ||||
| Error MetalClawReader::field(const char*, T *val, std::size_t valLen) { | ||||
| 	auto err = OxError(0); | ||||
| Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) { | ||||
| 	if (m_fieldPresence.get(m_field++)) { | ||||
| 		// read the length | ||||
| 		if (m_buffIt >= m_buffLen) { | ||||
| @@ -155,18 +154,22 @@ Error MetalClawReader::field(const char*, T *val, std::size_t valLen) { | ||||
| 			auto reader = child(); | ||||
| 			reader.setTypeInfo("List", len.value); | ||||
| 			for (std::size_t i = 0; i < len.value; i++) { | ||||
| 				err |= reader.field("", &val[i]); | ||||
| 				oxReturnError(reader.field("", &val[i])); | ||||
| 			} | ||||
| 		} else { | ||||
| 			err = OxError(MC_OUTBUFFENDED); | ||||
| 			oxTrace("ox::mc::read::field(T)") << name << ", size:" << valLen; | ||||
| 			return OxError(MC_OUTBUFFENDED); | ||||
| 		} | ||||
| 	} | ||||
| 	return err; | ||||
| 	return OxError(0); | ||||
| } | ||||
|  | ||||
| template<typename T> | ||||
| Error MetalClawReader::field(const char*, ox::Vector<T> *val) { | ||||
| 	return field(nullptr, val->data(), val->size()); | ||||
| Error MetalClawReader::field(const char* name, ox::Vector<T> *val) { | ||||
| 	const auto [len, err] = arrayLength(false); | ||||
| 	oxReturnError(err); | ||||
| 	val->resize(len); | ||||
| 	return field(name, val->data(), val->size()); | ||||
| } | ||||
|  | ||||
| template<typename T> | ||||
|   | ||||
							
								
								
									
										3
									
								
								deps/ox/src/ox/model/walk.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								deps/ox/src/ox/model/walk.hpp
									
									
									
									
										vendored
									
									
								
							| @@ -86,7 +86,8 @@ static ox::Error parseField(const DescriptorField &field, Reader *rdr, DataWalke | ||||
| 	walker->pushNamePath(field.fieldName); | ||||
| 	if (field.subscriptLevels) { | ||||
| 		// add array handling | ||||
| 		const auto arrayLen = rdr->arrayLength(true); | ||||
| 		const auto [arrayLen, err] = rdr->arrayLength(true); | ||||
| 		oxReturnError(err); | ||||
| 		auto child = rdr->child(); | ||||
| 		child.setTypeInfo(field.fieldName.c_str(), arrayLen); | ||||
| 		DescriptorField f(field); // create mutable copy | ||||
|   | ||||
		Reference in New Issue
	
	Block a user