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 785f145b20..8ac9898b92 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 @@ private static final ParquetMetadata readFooter( 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 f0a912f599..e1b6d76d82 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 @@ -1915,7 +1915,7 @@ private static void serializeFooter( 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; } @@ -1925,7 +1925,7 @@ private static void serializeFooter( 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);