@@ -90,6 +90,16 @@ std::unique_ptr<BloomFilter> RowGroupBloomFilterReaderImpl::GetColumnBloomFilter
9090 std::unique_ptr<Decryptor> bitset_decryptor =
9191 InternalFileDecryptor::GetColumnDataDecryptorFactory (file_decryptor_.get (),
9292 crypto_metadata.get ())();
93+ if (header_decryptor != nullptr || bitset_decryptor != nullptr ) {
94+ constexpr auto kEncryptedOrdinalLimit = 32767 ;
95+ if (ARROW_PREDICT_FALSE (row_group_ordinal_ > kEncryptedOrdinalLimit )) {
96+ throw ParquetException (" Encrypted files cannot contain more than 32767 row groups" );
97+ }
98+ if (ARROW_PREDICT_FALSE (i > kEncryptedOrdinalLimit )) {
99+ throw ParquetException (" Encrypted files cannot contain more than 32767 columns" );
100+ }
101+ }
102+
93103 if (header_decryptor != nullptr ) {
94104 UpdateDecryptor (header_decryptor.get (), row_group_ordinal_, static_cast <int16_t >(i),
95105 encryption::kBloomFilterHeader );
@@ -98,6 +108,7 @@ std::unique_ptr<BloomFilter> RowGroupBloomFilterReaderImpl::GetColumnBloomFilter
98108 UpdateDecryptor (bitset_decryptor.get (), row_group_ordinal_, static_cast <int16_t >(i),
99109 encryption::kBloomFilterBitset );
100110 }
111+
101112 const int64_t stream_length =
102113 bloom_filter_length ? *bloom_filter_length : file_size - *bloom_filter_offset;
103114 auto stream = ::arrow::io::RandomAccessFile::GetStream (input_, *bloom_filter_offset,
0 commit comments