diff options
author | Tor Brede Vekterli <vekterli@yahooinc.com> | 2023-01-26 17:56:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-26 17:56:47 +0100 |
commit | 2cd8172ae72a600f95d6488beb56a12e3ed3ce72 (patch) | |
tree | 38d28a02a4515826dd55b057785a48a64830d577 | |
parent | 2b04b587cddf6481ee82a19e536f071f2cf3db74 (diff) | |
parent | 6f685d73523ed956efbc0ce85d1fb29f5a86e012 (diff) |
Merge pull request #25758 from vespa-engine/vekterli/more-deserialization-improvements
More document deserialization improvements
-rw-r--r-- | document/src/vespa/document/serialization/vespadocumentdeserializer.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/document/src/vespa/document/serialization/vespadocumentdeserializer.cpp b/document/src/vespa/document/serialization/vespadocumentdeserializer.cpp index 829cf9d306c..bbe4f5373cb 100644 --- a/document/src/vespa/document/serialization/vespadocumentdeserializer.cpp +++ b/document/src/vespa/document/serialization/vespadocumentdeserializer.cpp @@ -282,9 +282,9 @@ VespaDocumentDeserializer::read(StringFieldValue &value) { setValue(value, val, _stream.isLongLivedBuffer()); if (coding & 0x40) { uint32_t serializedAnnotationsSize = readValue<uint32_t>(_stream); - value.setSpanTrees(vespalib::ConstBufferRef(_stream.peek(), serializedAnnotationsSize), - _repo, _version, _stream.isLongLivedBuffer()); - _stream.adjustReadPos(serializedAnnotationsSize); + auto span_buf = vespalib::ConstBufferRef(_stream.peek(), serializedAnnotationsSize); + _stream.adjustReadPos(serializedAnnotationsSize); // Trigger any out-of-bounds before using buffer range. + value.setSpanTrees(span_buf, _repo, _version, _stream.isLongLivedBuffer()); } else { value.clearSpanTrees(); } @@ -359,11 +359,13 @@ VespaDocumentDeserializer::readStructNoReset(StructFieldValue &value) { if (is_compressed && (compression_type != CompressionConfig::LZ4)) [[unlikely]] { throw DeserializeException(fmt("Unsupported compression type: %u", static_cast<uint8_t>(compression_type)), VESPA_STRLOC); } + // Must read field info _prior_ to checking remaining stream size against + // data_size, as the field info size is not counted as part of data_size. + readFieldInfo(_stream, field_info, is_compressed ? uncompressed_size : data_size); if (data_size > _stream.size()) [[unlikely]] { throw DeserializeException(fmt("Struct size (%zu) is greater than remaining buffer size (%zu)", data_size, _stream.size()), VESPA_STRLOC); } - readFieldInfo(_stream, field_info, is_compressed ? uncompressed_size : data_size); if (data_size > 0) { ByteBuffer buffer = is_compressed ? deCompress(compression_type, uncompressed_size, ConstBufferRef(_stream.peek(), data_size)) |