This is an automated email from the ASF dual-hosted git repository. afs pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit bc37c7622f0b700c45b9cff62b066d359ccb6688 Author: Andy Seaborne <[email protected]> AuthorDate: Thu Apr 30 11:21:48 2026 +0100 GH-3877: Add checks on bounds BinaryDataFileRandomAccess --- .../java/org/apache/jena/dboe/base/file/BinaryDataFile.java | 7 ++++--- .../jena/dboe/base/file/BinaryDataFileRandomAccess.java | 13 +++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/jena-db/jena-dboe-base/src/main/java/org/apache/jena/dboe/base/file/BinaryDataFile.java b/jena-db/jena-dboe-base/src/main/java/org/apache/jena/dboe/base/file/BinaryDataFile.java index 91e05018f1..d95408d137 100644 --- a/jena-db/jena-dboe-base/src/main/java/org/apache/jena/dboe/base/file/BinaryDataFile.java +++ b/jena-db/jena-dboe-base/src/main/java/org/apache/jena/dboe/base/file/BinaryDataFile.java @@ -26,9 +26,10 @@ import java.io.RandomAccessFile; import org.apache.jena.atlas.lib.Closeable; import org.apache.jena.atlas.lib.Sync; -/** An append-only, read-anywhere, binary file. - * A {@code BinaryDataFile} does not record the length and assumes the - * entries are self-defining. +/** + * An append-only, read-anywhere, binary file. + * A {@code BinaryDataFile} does not record the length of items in the file + * and assumes the entries are self-defining. * * @see RandomAccessFile */ diff --git a/jena-db/jena-dboe-base/src/main/java/org/apache/jena/dboe/base/file/BinaryDataFileRandomAccess.java b/jena-db/jena-dboe-base/src/main/java/org/apache/jena/dboe/base/file/BinaryDataFileRandomAccess.java index b3e2473a4e..87ab24a3b5 100644 --- a/jena-db/jena-dboe-base/src/main/java/org/apache/jena/dboe/base/file/BinaryDataFileRandomAccess.java +++ b/jena-db/jena-dboe-base/src/main/java/org/apache/jena/dboe/base/file/BinaryDataFileRandomAccess.java @@ -42,7 +42,7 @@ public class BinaryDataFileRandomAccess implements BinaryDataFile { protected RandomAccessFile file; protected boolean readMode; protected long readPosition; - protected long writePosition; + protected long writePosition; // This is the position of the end of the written area. private final String filename; public BinaryDataFileRandomAccess(String filename) { @@ -93,10 +93,13 @@ public class BinaryDataFileRandomAccess implements BinaryDataFile { return x; } - // Move the RandomAccess file pointer. + // Move the RandomAccess file pointer private void seek(long posn) { - try { file.seek(posn); } - catch (IOException ex) { IO.exception(ex); } + try { + if ( posn > writePosition ) + throw new RuntimeIOException("Seek beyond the end of the allocated file area [seek="+posn+",writePosition="+writePosition+"]"); + file.seek(posn); + } catch (IOException ex) { IO.exception(ex); } } @Override @@ -104,6 +107,8 @@ public class BinaryDataFileRandomAccess implements BinaryDataFile { checkOpen(); switchToWriteMode(); try { + if ( length > writePosition ) + throw new RuntimeIOException("Truncate beyond the end of the allocated file area [length="+length+",writePosition="+writePosition+"]"); file.setLength(length); writePosition = length; }
