Skip to content

Commit d639b06

Browse files
authored
MINOR: Reader fails fast when footer size is larger than INT_MAX (#3136)
1 parent 976e2d2 commit d639b06

File tree

2 files changed

+8
-3
lines changed

2 files changed

+8
-3
lines changed

parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,12 @@ private static final ParquetMetadata readFooter(
589589
long fileMetadataLengthIndex = fileLen - magic.length - FOOTER_LENGTH_SIZE;
590590
LOG.debug("reading footer index at {}", fileMetadataLengthIndex);
591591
f.seek(fileMetadataLengthIndex);
592-
int fileMetadataLength = readIntLittleEndian(f);
592+
long readFileMetadataLength = readIntLittleEndian(f) & 0xFFFFFFFFL;
593+
if (readFileMetadataLength > Integer.MAX_VALUE) {
594+
throw new RuntimeException("footer is too large: " + readFileMetadataLength + "to be read");
595+
}
596+
int fileMetadataLength = (int) readFileMetadataLength;
597+
593598
f.readFully(magic);
594599

595600
boolean encryptedFooterMode;

parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileWriter.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2063,7 +2063,7 @@ private static void serializeFooter(
20632063
out.write(serializedFooter);
20642064
out.write(signature);
20652065
LOG.debug("{}: footer and signature length = {}", out.getPos(), (out.getPos() - footerIndex));
2066-
BytesUtils.writeIntLittleEndian(out, toIntWithCheck(out.getPos() - footerIndex, "page"));
2066+
BytesUtils.writeIntLittleEndian(out, toIntWithCheck(out.getPos() - footerIndex, "footer"));
20672067
out.write(MAGIC);
20682068
return;
20692069
}
@@ -2073,7 +2073,7 @@ private static void serializeFooter(
20732073
writeFileCryptoMetaData(fileEncryptor.getFileCryptoMetaData(), out);
20742074
byte[] footerAAD = AesCipher.createFooterAAD(fileEncryptor.getFileAAD());
20752075
writeFileMetaData(parquetMetadata, out, fileEncryptor.getFooterEncryptor(), footerAAD);
2076-
int combinedMetaDataLength = toIntWithCheck(out.getPos() - cryptoFooterIndex, "page");
2076+
int combinedMetaDataLength = toIntWithCheck(out.getPos() - cryptoFooterIndex, "footer");
20772077
LOG.debug("{}: crypto metadata and footer length = {}", out.getPos(), combinedMetaDataLength);
20782078
BytesUtils.writeIntLittleEndian(out, combinedMetaDataLength);
20792079
out.write(EFMAGIC);

0 commit comments

Comments
 (0)