summaryrefslogtreecommitdiff
path: root/pr/src/md/windows/ntio.c
diff options
context:
space:
mode:
Diffstat (limited to 'pr/src/md/windows/ntio.c')
-rw-r--r--pr/src/md/windows/ntio.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/pr/src/md/windows/ntio.c b/pr/src/md/windows/ntio.c
index 040bbd31..40f52007 100644
--- a/pr/src/md/windows/ntio.c
+++ b/pr/src/md/windows/ntio.c
@@ -2252,6 +2252,7 @@ _PR_MD_READ(PRFileDesc *fd, void *buf, PRInt32 len)
int rv, err;
LONG hiOffset = 0;
LONG loOffset;
+ LARGE_INTEGER offset; /* use for a normalized add of len to offset */
if (!fd->secret->md.sync_file_io) {
PRThread *me = _PR_MD_CURRENT_THREAD();
@@ -2368,7 +2369,14 @@ _PR_MD_READ(PRFileDesc *fd, void *buf, PRInt32 len)
return -1;
}
- SetFilePointer((HANDLE)f, me->md.blocked_io_bytes, 0, FILE_CURRENT);
+ /* Apply the workaround from bug 70765 (see _PR_MD_WRITE)
+ * to the reading code, too. */
+
+ offset.LowPart = me->md.overlapped.overlapped.Offset;
+ offset.HighPart = me->md.overlapped.overlapped.OffsetHigh;
+ offset.QuadPart += me->md.blocked_io_bytes;
+
+ SetFilePointer((HANDLE)f, offset.LowPart, &offset.HighPart, FILE_BEGIN);
PR_ASSERT(me->io_pending == PR_FALSE);