Commit b111c0e
MapBufferBuilder: fix size_t→int32 partial-write in putString/putMapBuffer length encoding (#56525)
Summary:
Pull Request resolved: #56525
The MapBuffer wire format encodes lengths and offsets as `int32_t` (`MapBuffer::getString` / `getMapBuffer` read them as `*reinterpret_cast<const int32_t*>(...)`). But in `putString` and `putMapBuffer`:
```cpp
auto strSize = value.size(); // size_t — 8 bytes on 64-bit
memcpy(dynamicData_.data() + offset, &strSize, INT_SIZE); // copies first 4 of 8 bytes
```
`auto` deduces `size_t` from `.size()`, and `memcpy(&size_t_var, ..., 4)` writes only the **first 4 bytes** of an 8-byte object:
- **little-endian:** writes the low 4 bytes — silent truncation if size > UINT32_MAX
- **big-endian:** writes the high 4 bytes — encodes **zero** for normal sizes, producing a corrupt buffer the reader then trusts
`putMapBufferList` already had the correct pattern: `auto offset = static_cast<int32_t>(dynamicData_.size())`. This diff applies that same explicit `static_cast<int32_t>` to `putString` (`strSize`, `offset`) and `putMapBuffer` (`mapBufferSize`, `offset`) so the value being `memcpy`'d is exactly `INT_SIZE` bytes wide.
Changelog: [Internal]
Reviewed By: NickGerleman
Differential Revision: D100376322
fbshipit-source-id: ad0d505555e057240bf376795e867c52125590d81 parent 2902df0 commit b111c0e
1 file changed
Lines changed: 12 additions & 4 deletions
Lines changed: 12 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
84 | 84 | | |
85 | 85 | | |
86 | 86 | | |
87 | | - | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
88 | 93 | | |
89 | 94 | | |
90 | 95 | | |
91 | | - | |
| 96 | + | |
92 | 97 | | |
93 | 98 | | |
94 | 99 | | |
| |||
102 | 107 | | |
103 | 108 | | |
104 | 109 | | |
105 | | - | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
106 | 114 | | |
107 | | - | |
| 115 | + | |
108 | 116 | | |
109 | 117 | | |
110 | 118 | | |
| |||
0 commit comments