https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118162

            Bug ID: 118162
           Summary: ofstream::write(…, count) fails when count >= 2^31 on
                    darwin
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mimomorin at gmail dot com
  Target Milestone: ---

Created attachment 59937
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59937&action=edit
Testcase for ofstream::write(…, count >= 2^31)

This is a companion PR to PR102259.
On macOS, `ofstream::write(…, count >= 2^31)` fails without partial write.
Here is the attached test case:
    #include <iostream>
    #include <fstream>
    int main() {
        auto buffer = new char[1LL << 31];
        std::ofstream os{"2GiB.bin", std::ios::binary};
        os.write(buffer, 1LL << 31);
        std::cout << os.good() << " (" << os.tellp() << " bytes)\n";
        // Expected output: "1 (2147483648 bytes)"
        // Actual output on macOS 11 or newer: "0 (-1 bytes)"
    }

Here are the manpages for `write` and `writev` in macOS and FreeBSD:

[macOS manpage]
https://keith.github.io/xcode-man-pages/write.2.html
  … write() … will fail and the file pointer will remain unchanged if:
  The value provided for nbyte exceeds INT_MAX.
  … writev() … may also return the following errors:
  The sum of the iov_len values in the iov array overflows a 32-bit integer.

[FreeBSD manpage]
https://man.freebsd.org/cgi/man.cgi?query=writev
  … write(), writev() … will fail and the file pointer will remain unchanged:
  The value nbytes is greater than SSIZE_MAX
  (or greater than INT_MAX, if the sysctl debug.iosize_max_clamp is non-zero).
  … writev() … may return one of the following errors:
  The sum of the iov_len values is greater than SSIZE_MAX
  (or greater than INT_MAX, if the sysctl debug.iosize_max_clamp is non-zero).

Reply via email to