This is an automated email from the ASF dual-hosted git repository.
gangwu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/parquet-java.git
The following commit(s) were added to refs/heads/master by this push:
new d639b064c MINOR: Reader fails fast when footer size is larger than
INT_MAX (#3136)
d639b064c is described below
commit d639b064c596f268808b443be65439fab7c9086c
Author: Xianyang Liu <[email protected]>
AuthorDate: Wed Mar 5 10:03:04 2025 +0800
MINOR: Reader fails fast when footer size is larger than INT_MAX (#3136)
---
.../src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java | 7 ++++++-
.../src/main/java/org/apache/parquet/hadoop/ParquetFileWriter.java | 4 ++--
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git
a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java
b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java
index 785f145b2..8ac9898b9 100644
---
a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java
+++
b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java
@@ -589,7 +589,12 @@ public class ParquetFileReader implements Closeable {
long fileMetadataLengthIndex = fileLen - magic.length - FOOTER_LENGTH_SIZE;
LOG.debug("reading footer index at {}", fileMetadataLengthIndex);
f.seek(fileMetadataLengthIndex);
- int fileMetadataLength = readIntLittleEndian(f);
+ long readFileMetadataLength = readIntLittleEndian(f) & 0xFFFFFFFFL;
+ if (readFileMetadataLength > Integer.MAX_VALUE) {
+ throw new RuntimeException("footer is too large: " +
readFileMetadataLength + "to be read");
+ }
+ int fileMetadataLength = (int) readFileMetadataLength;
+
f.readFully(magic);
boolean encryptedFooterMode;
diff --git
a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileWriter.java
b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileWriter.java
index 9b2f7f445..02efcc8b5 100644
---
a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileWriter.java
+++
b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileWriter.java
@@ -2063,7 +2063,7 @@ public class ParquetFileWriter implements AutoCloseable {
out.write(serializedFooter);
out.write(signature);
LOG.debug("{}: footer and signature length = {}", out.getPos(),
(out.getPos() - footerIndex));
- BytesUtils.writeIntLittleEndian(out, toIntWithCheck(out.getPos() -
footerIndex, "page"));
+ BytesUtils.writeIntLittleEndian(out, toIntWithCheck(out.getPos() -
footerIndex, "footer"));
out.write(MAGIC);
return;
}
@@ -2073,7 +2073,7 @@ public class ParquetFileWriter implements AutoCloseable {
writeFileCryptoMetaData(fileEncryptor.getFileCryptoMetaData(), out);
byte[] footerAAD = AesCipher.createFooterAAD(fileEncryptor.getFileAAD());
writeFileMetaData(parquetMetadata, out,
fileEncryptor.getFooterEncryptor(), footerAAD);
- int combinedMetaDataLength = toIntWithCheck(out.getPos() -
cryptoFooterIndex, "page");
+ int combinedMetaDataLength = toIntWithCheck(out.getPos() -
cryptoFooterIndex, "footer");
LOG.debug("{}: crypto metadata and footer length = {}", out.getPos(),
combinedMetaDataLength);
BytesUtils.writeIntLittleEndian(out, combinedMetaDataLength);
out.write(EFMAGIC);