Skip to content

Commit

Permalink
8246729: MappedByteBuffer.force() throws IndexOutOfBoundsException
Browse files Browse the repository at this point in the history
Reviewed-by: psandoz, alanb
  • Loading branch information
Brian Burkhalter committed Jun 8, 2020
1 parent 63ade9c commit 1786701
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 15 deletions.
15 changes: 7 additions & 8 deletions src/java.base/share/classes/java/nio/MappedByteBuffer.java
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -223,11 +223,9 @@ public final MappedByteBuffer force() {
if (fd == null) {
return this;
}
if (isSync) {
return force(0, limit());
}
if ((address != 0) && (capacity() != 0)) {
return force(0, capacity());
int limit = limit();
if (isSync || ((address != 0) && (limit != 0))) {
return force(0, limit);
}
return this;
}
Expand Down Expand Up @@ -278,9 +276,10 @@ public final MappedByteBuffer force(int index, int length) {
if (fd == null) {
return this;
}
if ((address != 0) && (limit() != 0)) {
int limit = limit();
if ((address != 0) && (limit != 0)) {
// check inputs
Objects.checkFromIndexSize(index, length, limit());
Objects.checkFromIndexSize(index, length, limit);
MappedMemoryUtils.force(fd, address, isSync, index, length);
}
return this;
Expand Down
35 changes: 28 additions & 7 deletions test/jdk/java/nio/MappedByteBuffer/Force.java
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
Expand All @@ -22,20 +22,31 @@
*/

/* @test
* @bug 4625907
* @bug 4625907 8246729
* @summary Testing force()
* @library /test/lib
* @build jdk.test.lib.RandomFactory
* @run main/othervm Force
* @key randomness
*/

import java.io.*;
import java.nio.*;
import java.util.*;
import java.nio.channels.*;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import static java.nio.file.StandardOpenOption.*;
import java.util.Random;
import jdk.test.lib.RandomFactory;

public class Force {
public static void main(String[] args) throws Exception {
Random random = new Random();
test1();
test2();
}

private static void test1() throws Exception {
Random random = RandomFactory.getRandom();
long filesize = random.nextInt(3*1024*1024);
int cut = random.nextInt((int)filesize);
File file = File.createTempFile("Blah", null);
Expand All @@ -51,4 +62,14 @@ public static void main(String[] args) throws Exception {
System.gc();
Thread.sleep(500);
}

private static void test2() throws Exception {
var path = Files.createTempFile("test", "map");
var channel = FileChannel.open(path, READ, WRITE);
MappedByteBuffer buffer =
channel.map(FileChannel.MapMode.READ_WRITE, 0, 1000);
buffer.putInt(1234);
buffer.limit(4);
buffer.force();
}
}

0 comments on commit 1786701

Please sign in to comment.