Bug 53516 - Error writing files greater than 4GB in 32 bit OS
Summary: Error writing files greater than 4GB in 32 bit OS
Status: CONFIRMED
Alias: None
Product: Class Libraries
Classification: Mono
Component: Mono.POSIX (show other bugs)
Version: unspecified
Hardware: PC Linux
: --- normal
Target Milestone: Future Release
Assignee: Bugzilla
URL:
Depends on:
Blocks:
 
Reported: 2017-03-20 11:13 UTC by pedro
Modified: 2017-09-11 16:37 UTC (History)
2 users (show)

See Also:
Tags:
Is this bug a regression?: ---
Last known good build:


Attachments

Description pedro 2017-03-20 11:13:19 UTC
I'm trying to write a new file with size > 4 gb using mono c# and Mono.Posix library, with the Syscall.pwrite() function. But in a 32-bit OS, I get error EOVERFLOW when the offset reach 4GB. 

This is the example code I'm using: 

    public unsafe static void Main (string[] args) 
    { 
        int fd = Syscall.open("/dev/null", OpenFlags.O_WRONLY); 
        long bLen = 4096; 
        long fLen = 5368709120; 
        byte[] buffer = new byte[bLen]; 
        long c = 0; 
        long res = -1; 
        if (fd == -1) 
            goto Finish; 

        do 
        { 
            fixed (byte *pb = buffer) 
            { 

                res = Syscall.pwrite(fd, pb, (ulong)bLen, c); 
                if (res == -1) 
                    break; 
                c+= bLen; 
            } 
        } 
        while (c < fLen); 
        Syscall.close(fd); 

        Finish: 
        if (res == -1) 
        { 
            Console.WriteLine("Error in offset " + c.ToString()); 
            Console.WriteLine("Error: " + Stdlib.GetLastError()); 
        } 
        else 
        { 
            Console.WriteLine("All OK"); 
        } 
        Console.ReadLine(); 
    } 


In 64-bit OS, the output is "All OK", but in 32-bit OS the output is "Error: EOVERFLOW". I think there is an issue in Mono.Posix library.
Comment 1 Marek Safar 2017-09-11 16:37:31 UTC
Full repro

using System;
using Mono.Unix.Native;

class X
{
   public unsafe static void Main (string[] args) 
    { 
        int fd = Syscall.open("/dev/null", OpenFlags.O_WRONLY); 
        long bLen = 4096; 
        long fLen = 5368709120; 
        byte[] buffer = new byte[bLen]; 
        long c = 0; 
        long res = -1; 
        if (fd == -1) 
            goto Finish; 

        do 
        { 
            fixed (byte *pb = buffer) 
            { 

                res = Syscall.pwrite(fd, pb, (ulong)bLen, c); 
                if (res == -1) 
                    break; 
                c+= bLen; 
            } 
        } 
        while (c < fLen); 
        Syscall.close(fd); 

        Finish: 
        if (res == -1) 
        { 
            Console.WriteLine("Error in offset " + c.ToString()); 
            Console.WriteLine("Error: " + Stdlib.GetLastError()); 
        } 
        else 
        { 
            Console.WriteLine("All OK"); 
        } 
        Console.ReadLine(); 
    } 
}

Note You need to log in before you can comment on or make changes to this bug.