Uploaded image for project: 'Harmony'
  1. Harmony
  2. HARMONY-6542

java.io.RandomAccessFile.seek (long pos) throughs exception on calls with "pos" set to values greater then 0x7FFFFFFF

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 6.0M1, 5.0M13
    • Fix Version/s: None
    • Component/s: Classlib
    • Environment:
      32bit Linux/windows
    • Patch Info:
      Patch Available
    • Estimated Complexity:
      Moderate

      Description

      Dear Community
      .
      Calling java.io.RandomAccessFile.seek (long pos) throughs an exception on calls with "pos" set to values larger then 0x7FFFFFFF.

      I checked this on Linux for the 32bit versions of the stable hy6 build (6M1) and also on the current svn trunk from yesterday (June 2nd 2010).

      This issue was reported by others to also occur on Linux for the stable hy5 (5M13) build and on windows for the stable 5/6 builds.

      I checked the stable 64bit version for Linux, to find the issue NOT to occur in there, seek for values greater then 2Gig worked fine there.

      Investigations on the 32bit sources of the shared luni code showed a casting issue, mostly like introduced by the idea that all signed integers on the 32bit version have a maximum lenght of 32bits. This is not the case for seeking, which should work until seek distances up to 0x7FFFFFFFFFFFFFFF.

      The underlying os-specific code (linux and windows) does take care of the possibility of 63bit long distances. Just a nasty casting of the distance down to 32bit somewhere a bit more upper in the calling stack makes those "long distance" calls fail.

      Change this casting does it for windows.

      To get things going on linux also the additional C-define "#define _FILE_OFFSET_BITS 64" needs to be set for building.

      I'm not sure if I added this define for the linux build to best place possible, so please any hy-gurus out there have a look at it.

      I append a patch (for Linux hy5-stable (5M13) to this posting which solves this (casting-)issue and adds the C-define. It's quite small and it should be easy to addept it to other source releases. If anyone likes I could also provide patches for the current stable hy6 (6M1) or even the current svn-trunk.

      Thanks and happy hacking...

      Kind regards
      /a

        Activity

        Hide
        ealk Ernst Albrecht Köstlin added a comment -

        Patch to allow calls to RandomAccessFile.seek (long pos) for Hy5M1 (32bit) work for pos >0x7FFFFFFF

        Show
        ealk Ernst Albrecht Köstlin added a comment - Patch to allow calls to RandomAccessFile.seek (long pos) for Hy5M1 (32bit) work for pos >0x7FFFFFFF
        Hide
        hindessm Mark Hindess added a comment -

        Thanks for this contribution. Could you please complete ICLAs and ACQs as mentioned at:

        http://harmony.apache.org/contribution_policy.html

        Sign them, scan them and email them to private@harmony.apache.org.

        Thanks,
        Mark.

        Show
        hindessm Mark Hindess added a comment - Thanks for this contribution. Could you please complete ICLAs and ACQs as mentioned at: http://harmony.apache.org/contribution_policy.html Sign them, scan them and email them to private@harmony.apache.org. Thanks, Mark.
        Hide
        hindessm Mark Hindess added a comment -

        I've applied your patch at r953177. Please confirm that it has been applied as expected and that the issue is resolved.

        Normally I ask for confirmation by simply closing this JIRA but I'd like to come up with a regression test first. However, I tried using the following (in the context of the existing test):

        // Regression test for HARMONY-6542
        public void testRandomAccessFile_seekMoreThan2gb() throws IOException

        { RandomAccessFile raf = new RandomAccessFile(f, "rw"); // write a few bytes so we get more helpful error messages // if we land in the wrong places raf.write(1); raf.write(2); raf.seek(2147483647); raf.write(3); raf.write(4); raf.write(5); raf.write(6); raf.seek(0); assertEquals("seek 0", 1, raf.read()); raf.seek(2147483649L); assertEquals("seek >2gb", 5, raf.read()); raf.seek(0); assertEquals("seek back to 0", 1, raf.read()); raf.close(); }

        and this fails without your fix and passes with it as expected. Any (by virtue of the use of sparse files) passes even if less than 2GB of free disk space are available. However, this test fails on windows for me even with the fix (though I assume this is because I have less than 2GB of space available). Does anyone know how to write a regression test that uses sparse files on windows?
        Or should the above use sparse files and it just doesn't work because the fix is incomplete?

        Show
        hindessm Mark Hindess added a comment - I've applied your patch at r953177. Please confirm that it has been applied as expected and that the issue is resolved. Normally I ask for confirmation by simply closing this JIRA but I'd like to come up with a regression test first. However, I tried using the following (in the context of the existing test): // Regression test for HARMONY-6542 public void testRandomAccessFile_seekMoreThan2gb() throws IOException { RandomAccessFile raf = new RandomAccessFile(f, "rw"); // write a few bytes so we get more helpful error messages // if we land in the wrong places raf.write(1); raf.write(2); raf.seek(2147483647); raf.write(3); raf.write(4); raf.write(5); raf.write(6); raf.seek(0); assertEquals("seek 0", 1, raf.read()); raf.seek(2147483649L); assertEquals("seek >2gb", 5, raf.read()); raf.seek(0); assertEquals("seek back to 0", 1, raf.read()); raf.close(); } and this fails without your fix and passes with it as expected. Any (by virtue of the use of sparse files) passes even if less than 2GB of free disk space are available. However, this test fails on windows for me even with the fix (though I assume this is because I have less than 2GB of space available). Does anyone know how to write a regression test that uses sparse files on windows? Or should the above use sparse files and it just doesn't work because the fix is incomplete?
        Hide
        hudson Hudson added a comment -

        Integrated in Harmony-1.5-head-linux-x86_64 #837 (See http://hudson.zones.apache.org/hudson/job/Harmony-1.5-head-linux-x86_64/837/)
        Applying patch from "HARMONY-6542 java.io.RandomAccessFile.seek(long pos)
        throughs exception on calls with "pos" set to values greater then 0x7FFFFFFF".
        I'd still like to write a regression test but need help to find one that works
        on windows.

        Show
        hudson Hudson added a comment - Integrated in Harmony-1.5-head-linux-x86_64 #837 (See http://hudson.zones.apache.org/hudson/job/Harmony-1.5-head-linux-x86_64/837/ ) Applying patch from " HARMONY-6542 java.io.RandomAccessFile.seek(long pos) throughs exception on calls with "pos" set to values greater then 0x7FFFFFFF". I'd still like to write a regression test but need help to find one that works on windows.
        Hide
        hudson Hudson added a comment -

        Integrated in Harmony-select-1.5-head-linux-x86_64 #25 (See http://hudson.zones.apache.org/hudson/job/Harmony-select-1.5-head-linux-x86_64/25/)
        Applying patch from "HARMONY-6542 java.io.RandomAccessFile.seek(long pos)
        throughs exception on calls with "pos" set to values greater then 0x7FFFFFFF".
        I'd still like to write a regression test but need help to find one that works
        on windows.

        Show
        hudson Hudson added a comment - Integrated in Harmony-select-1.5-head-linux-x86_64 #25 (See http://hudson.zones.apache.org/hudson/job/Harmony-select-1.5-head-linux-x86_64/25/ ) Applying patch from " HARMONY-6542 java.io.RandomAccessFile.seek(long pos) throughs exception on calls with "pos" set to values greater then 0x7FFFFFFF". I'd still like to write a regression test but need help to find one that works on windows.
        Hide
        ealk Ernst Albrecht Köstlin added a comment -

        I had someone integrate this patch into a Hy5 build for windows and was
        told files up to 8GB could have been read.

        Regards
        /a


        Si forte in alienas manus oberraverit hec peregrina epistola incertis ventis dimissa, sed Deo commendata, precamur ut ei reddatur cui soli destinata, nec preripiat quisquam non sibi parata.

        Show
        ealk Ernst Albrecht Köstlin added a comment - I had someone integrate this patch into a Hy5 build for windows and was told files up to 8GB could have been read. Regards /a – Si forte in alienas manus oberraverit hec peregrina epistola incertis ventis dimissa, sed Deo commendata, precamur ut ei reddatur cui soli destinata, nec preripiat quisquam non sibi parata.
        Hide
        ealk Ernst Albrecht Köstlin added a comment -

        And actually seek arounded in.... |-}

        /a


        Si forte in alienas manus oberraverit hec peregrina epistola incertis ventis dimissa, sed Deo commendata, precamur ut ei reddatur cui soli destinata, nec preripiat quisquam non sibi parata.

        Show
        ealk Ernst Albrecht Köstlin added a comment - And actually seek arounded in.... |-} /a – Si forte in alienas manus oberraverit hec peregrina epistola incertis ventis dimissa, sed Deo commendata, precamur ut ei reddatur cui soli destinata, nec preripiat quisquam non sibi parata.
        Hide
        ealk Ernst Albrecht Köstlin added a comment -

        should read: "... seeked around ... " sry


        Si forte in alienas manus oberraverit hec peregrina epistola incertis ventis dimissa, sed Deo commendata, precamur ut ei reddatur cui soli destinata, nec preripiat quisquam non sibi parata.

        Show
        ealk Ernst Albrecht Köstlin added a comment - should read: "... seeked around ... " sry – Si forte in alienas manus oberraverit hec peregrina epistola incertis ventis dimissa, sed Deo commendata, precamur ut ei reddatur cui soli destinata, nec preripiat quisquam non sibi parata.
        Hide
        ealk Ernst Albrecht Köstlin added a comment -

        Hi Mark

        Thanks for applying the patch...!

        And yes: Things looks good.

        regards
        /a

        Show
        ealk Ernst Albrecht Köstlin added a comment - Hi Mark Thanks for applying the patch...! And yes: Things looks good. regards /a
        Hide
        hindessm Mark Hindess added a comment -

        I've added a regression test (for unix only since windows would always need 2GB free disk space to pass) at r957142. I've asked around and no one seems to have a good solution for windows so I am going to close this issue.

        Show
        hindessm Mark Hindess added a comment - I've added a regression test (for unix only since windows would always need 2GB free disk space to pass) at r957142. I've asked around and no one seems to have a good solution for windows so I am going to close this issue.
        Hide
        hudson Hudson added a comment -

        Integrated in Harmony-select-1.5-head-linux-x86_64 #38 (See http://hudson.zones.apache.org/hudson/job/Harmony-select-1.5-head-linux-x86_64/38/)
        Add regression test for "HARMONY-6542 java.io.RandomAccessFile.seek
        (long pos) throughs exception on calls with 'pos' set to values
        greater then 0x7FFFFFFF". Only works for unix platforms but that's better
        than not having one.

        Show
        hudson Hudson added a comment - Integrated in Harmony-select-1.5-head-linux-x86_64 #38 (See http://hudson.zones.apache.org/hudson/job/Harmony-select-1.5-head-linux-x86_64/38/ ) Add regression test for " HARMONY-6542 java.io.RandomAccessFile.seek (long pos) throughs exception on calls with 'pos' set to values greater then 0x7FFFFFFF". Only works for unix platforms but that's better than not having one.
        Hide
        hudson Hudson added a comment -

        Integrated in Harmony-1.5-head-linux-x86_64 #859 (See http://hudson.zones.apache.org/hudson/job/Harmony-1.5-head-linux-x86_64/859/)
        Add regression test for "HARMONY-6542 java.io.RandomAccessFile.seek
        (long pos) throughs exception on calls with 'pos' set to values
        greater then 0x7FFFFFFF". Only works for unix platforms but that's better
        than not having one.

        Show
        hudson Hudson added a comment - Integrated in Harmony-1.5-head-linux-x86_64 #859 (See http://hudson.zones.apache.org/hudson/job/Harmony-1.5-head-linux-x86_64/859/ ) Add regression test for " HARMONY-6542 java.io.RandomAccessFile.seek (long pos) throughs exception on calls with 'pos' set to values greater then 0x7FFFFFFF". Only works for unix platforms but that's better than not having one.

          People

          • Assignee:
            hindessm Mark Hindess
            Reporter:
            ealk Ernst Albrecht Köstlin
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development