Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8137121

(fc) Infinite loop FileChannel.truncate

    Details

    • Subcomponent:
    • Resolved In Build:
      b84
    • Verification:
      Verified

      Backports

        Description

        FULL PRODUCT VERSION :


        A DESCRIPTION OF THE PROBLEM :
        sun.nio.ch.FileChannelImpl#truncate(long) has this loop
        do {
           rv = (int)position0(fd, p);
        } while ((rv == IOStatus.INTERRUPTED) && isOpen());

        Problem is that in cases where position0(fd, p) returns p, and it just happens that p is a long value that when cast to int becomes -3, then the loop here where never terminate since IOStatus.INTERRUPTED is -3 as well.

        STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
        package play;

        import java.io.File;
        import java.io.RandomAccessFile;
        import java.nio.ByteBuffer;
        import java.nio.channels.FileChannel;

        public class Play {
        public static void main(String[] args) throws Throwable {
        ByteBuffer zeroByte = ByteBuffer.wrap(new byte[1]);
        File file = File.createTempFile("whatever", null);
        try (RandomAccessFile raf = new RandomAccessFile(file, "rw")
        ) {
        FileChannel channel = raf.getChannel();
        channel.position(8589934589L + 1);
        channel.write(zeroByte);
        zeroByte.flip();
        channel.truncate(8589934589L);
        }
        }
        }

        and now the thread will be stuck in that loop within FIleChannelImpl as described


        EXPECTED VERSUS ACTUAL BEHAVIOR :
        EXPECTED -
        that the truncation works
        ACTUAL -
        the thread gets into an infinite loop and never returns

        REPRODUCIBILITY :
        This bug can be reproduced always.

        ---------- BEGIN SOURCE ----------
        package play;

        import java.io.File;
        import java.io.RandomAccessFile;
        import java.nio.ByteBuffer;
        import java.nio.channels.FileChannel;

        public class Play {
        public static void main(String[] args) throws Throwable {
        ByteBuffer zeroByte = ByteBuffer.wrap(new byte[1]);
        File file = File.createTempFile("whatever", null);
        try (RandomAccessFile raf = new RandomAccessFile(file, "rw")
        ) {
        FileChannel channel = raf.getChannel();
        channel.position(8589934589L + 1);
        channel.write(zeroByte);
        zeroByte.flip();
        channel.truncate(8589934589L);
        }
        }
        }
        ---------- END SOURCE ----------

          Issue Links

            Activity

            Hide
            hgupdate HG Updates added a comment -
            URL: http://hg.openjdk.java.net/jdk9/dev/jdk/rev/551959336e36
            User: igerasim
            Date: 2015-09-25 21:25:40 +0000
            Show
            hgupdate HG Updates added a comment - URL: http://hg.openjdk.java.net/jdk9/dev/jdk/rev/551959336e36 User: igerasim Date: 2015-09-25 21:25:40 +0000
            Hide
            hgupdate HG Updates added a comment -
            URL: http://hg.openjdk.java.net/jdk9/jdk9/jdk/rev/551959336e36
            User: lana
            Date: 2015-09-30 22:17:42 +0000
            Show
            hgupdate HG Updates added a comment - URL: http://hg.openjdk.java.net/jdk9/jdk9/jdk/rev/551959336e36 User: lana Date: 2015-09-30 22:17:42 +0000

              People

              • Assignee:
                igerasim Ivan Gerasimov
                Reporter:
                webbuggrp Webbug Group
              • Votes:
                0 Vote for this issue
                Watchers:
                4 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: