|
22 | 22 | // may silently cap this to /proc/sys/fs/pipe-max-size. |
23 | 23 | static constexpr int kPipeBufferSize = 1024 * 1024; |
24 | 24 |
|
| 25 | +static constexpr uint64_t kMaxPipeArrayBytes = 4ULL * 1024 * 1024 * 1024; |
| 26 | +static constexpr uint32_t kMaxPipeArrayFields = 10000; |
| 27 | + |
25 | 28 | // Pipe I/O primitives defined in grpc_job_management.cpp. |
26 | 29 | bool write_to_pipe(int fd, const void* data, size_t size); |
27 | 30 | bool read_from_pipe(int fd, void* data, size_t size, int timeout_ms = 120000); |
@@ -135,13 +138,15 @@ inline bool read_chunked_request_from_pipe(int fd, |
135 | 138 |
|
136 | 139 | uint32_t num_arrays; |
137 | 140 | if (!read_from_pipe(fd, &num_arrays, sizeof(num_arrays))) return false; |
| 141 | + if (num_arrays > kMaxPipeArrayFields) return false; |
138 | 142 |
|
139 | 143 | // Read each field's raw bytes directly into the output map, keyed by field_id. |
140 | 144 | for (uint32_t i = 0; i < num_arrays; ++i) { |
141 | 145 | int32_t field_id; |
142 | 146 | uint64_t total_bytes; |
143 | 147 | if (!read_from_pipe(fd, &field_id, sizeof(field_id))) return false; |
144 | 148 | if (!read_from_pipe(fd, &total_bytes, sizeof(total_bytes))) return false; |
| 149 | + if (total_bytes > kMaxPipeArrayBytes) return false; |
145 | 150 | auto& dest = arrays_out[field_id]; |
146 | 151 | dest.resize(static_cast<size_t>(total_bytes)); |
147 | 152 | if (total_bytes > 0 && !read_from_pipe(fd, dest.data(), static_cast<size_t>(total_bytes))) |
@@ -188,12 +193,14 @@ inline bool read_result_from_pipe(int fd, |
188 | 193 |
|
189 | 194 | uint32_t num_arrays; |
190 | 195 | if (!read_from_pipe(fd, &num_arrays, sizeof(num_arrays))) return false; |
| 196 | + if (num_arrays > kMaxPipeArrayFields) return false; |
191 | 197 |
|
192 | 198 | for (uint32_t i = 0; i < num_arrays; ++i) { |
193 | 199 | int32_t field_id; |
194 | 200 | uint64_t total_bytes; |
195 | 201 | if (!read_from_pipe(fd, &field_id, sizeof(field_id))) return false; |
196 | 202 | if (!read_from_pipe(fd, &total_bytes, sizeof(total_bytes))) return false; |
| 203 | + if (total_bytes > kMaxPipeArrayBytes) return false; |
197 | 204 | auto& dest = arrays_out[field_id]; |
198 | 205 | dest.resize(static_cast<size_t>(total_bytes)); |
199 | 206 | if (total_bytes > 0 && !read_from_pipe(fd, dest.data(), static_cast<size_t>(total_bytes))) |
|
0 commit comments