| 318 | } |
| 319 | |
| 320 | DeserializationError::Code readRawString(VariantData* variant, |
| 321 | const void* header, |
| 322 | uint8_t headerSize, size_t n) { |
| 323 | auto totalSize = size_t(headerSize + n); |
| 324 | if (totalSize < n) // integer overflow |
| 325 | return DeserializationError::NoMemory; // (not testable on 64-bit) |
| 326 | |
| 327 | char* p = stringBuffer_.reserve(totalSize); |
| 328 | if (!p) |
| 329 | return DeserializationError::NoMemory; |
| 330 | |
| 331 | memcpy(p, header, headerSize); |
| 332 | |
| 333 | auto err = readBytes(p + headerSize, n); |
| 334 | if (err) |
| 335 | return err; |
| 336 | |
| 337 | stringBuffer_.saveRaw(variant); |
| 338 | return DeserializationError::Ok; |
| 339 | } |
| 340 | |
| 341 | template <typename TFilter> |
| 342 | DeserializationError::Code readArray( |
no test coverage detected