Skip to content

Commit

Permalink
fix issue 11791 - std.file.write failed to write huge files
Browse files Browse the repository at this point in the history
  • Loading branch information
Basile Burg committed May 6, 2016
1 parent 97b4fe4 commit 2ff9afa
Showing 1 changed file with 28 additions and 18 deletions.
46 changes: 28 additions & 18 deletions std/file.d
Original file line number Diff line number Diff line change
Expand Up @@ -539,10 +539,18 @@ version(Posix) private void writeImpl(const(char)[] name, const(FSChar)* namez,
cenforce(fd != -1, name, namez);
{
scope(failure) core.sys.posix.unistd.close(fd);

immutable size = buffer.length;
cenforce(
core.sys.posix.unistd.write(fd, buffer.ptr, size) == size,
name, namez);
size_t sum, cnt = void;
while (sum != size)
{
cnt = (size - sum < 2^^30) ? (size - sum) : 2^^30;
auto numwritten = core.sys.posix.unistd.write(fd, buffer.ptr + sum, cnt);
if (numwritten != cnt)
break;
sum += numwritten;
}
cenforce(sum == size, name, namez);
}
cenforce(core.sys.posix.unistd.close(fd) == 0, name, namez);
}
Expand All @@ -552,22 +560,18 @@ version(Posix) private void writeImpl(const(char)[] name, const(FSChar)* namez,
version(Windows) private void writeImpl(const(char)[] name, const(FSChar)* namez,
in void[] buffer, bool append) @trusted
{
HANDLE h;
if (append)
{
alias defaults =
AliasSeq!(GENERIC_WRITE, 0, null, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
HANDLE.init);

auto h = CreateFileW(namez, defaults);

h = CreateFileW(namez, defaults);
cenforce(h != INVALID_HANDLE_VALUE, name, namez);
scope(exit) cenforce(CloseHandle(h), name, namez);
DWORD numwritten;
cenforce(SetFilePointer(h, 0, null, FILE_END) != INVALID_SET_FILE_POINTER
&& WriteFile(h,buffer.ptr,to!DWORD(buffer.length),&numwritten,null) != 0
&& buffer.length == numwritten,
name, namez);
cenforce(SetFilePointer(h, 0, null, FILE_END) != INVALID_SET_FILE_POINTER,
name, namez);
}
else // write
{
Expand All @@ -576,15 +580,21 @@ version(Windows) private void writeImpl(const(char)[] name, const(FSChar)* namez
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
HANDLE.init);

auto h = CreateFileW(namez, defaults);

h = CreateFileW(namez, defaults);
cenforce(h != INVALID_HANDLE_VALUE, name, namez);
scope(exit) cenforce(CloseHandle(h), name, namez);
DWORD numwritten;
cenforce(WriteFile(h, buffer.ptr, to!DWORD(buffer.length), &numwritten, null) != 0
&& buffer.length == numwritten,
name, namez);
}
immutable size = buffer.length;
size_t sum, cnt = void;
DWORD numwritten = void;
while (sum != size)
{
cnt = (size - sum < 2^^30) ? (size - sum) : 2^^30;
WriteFile(h, buffer.ptr + sum, cast(uint) cnt, &numwritten, null);
if (numwritten != cnt)
break;
sum += numwritten;
}
cenforce(sum == size && CloseHandle(h), name, namez);
}

/***************************************************
Expand Down

0 comments on commit 2ff9afa

Please sign in to comment.