Skip to content

Commit bcd56dc

Browse files
committed
Prevent overreading
1 parent 7e3e91b commit bcd56dc

1 file changed

Lines changed: 4 additions & 3 deletions

File tree

cpp/src/arrow/util/bpacking_dispatch_internal.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,17 +189,18 @@ void unpack_width(const uint8_t* in, UnpackedUInt* out, int batch_size, int bit_
189189
} else {
190190
using UnpackerForWidth = Unpacker<UnpackedUInt, kPackedBitWidth>;
191191
constexpr auto kValuesUnpacked = UnpackerForWidth::kValuesUnpacked;
192+
constexpr auto kBytesRead = UnpackerForWidth::kBytesRead;
192193

193194
if constexpr (kValuesUnpacked > 0) {
194195
// Running the optimized kernel for batch extraction
195-
const int unpacker_iter_count = batch_size / kValuesUnpacked;
196+
const int bytes_to_unpack = (batch_size * kPackedBitWidth) / 8;
197+
const int unpacker_iter_count =
198+
std::min(batch_size / kValuesUnpacked, bytes_to_unpack / kBytesRead);
196199
for (int i = 0; i < unpacker_iter_count; ++i) {
197200
in = UnpackerForWidth::unpack(in, out);
198201
out += kValuesUnpacked;
199202
}
200203
batch_size -= unpacker_iter_count * kValuesUnpacked;
201-
ARROW_DCHECK_LT(batch_size, kValuesUnpacked);
202-
ARROW_COMPILER_ASSUME(batch_size < kValuesUnpacked);
203204
}
204205

205206
// Running the epilog for the remaining values that don't fit in a kernel

0 commit comments

Comments
 (0)