Skip to content

Commit 423ff0d

Browse files
committed
Merge pull request #486 from dscho/mmap-no-error
Better mmap() emulation
2 parents e3395e6 + 100a1f1 commit 423ff0d

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

compat/win32mmap.c

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,42 @@
22

33
void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
44
{
5-
HANDLE hmap;
5+
HANDLE osfhandle, hmap;
66
void *temp;
7-
off_t len;
8-
struct stat st;
7+
LARGE_INTEGER len;
98
uint64_t o = offset;
109
uint32_t l = o & 0xFFFFFFFF;
1110
uint32_t h = (o >> 32) & 0xFFFFFFFF;
1211

13-
if (!fstat(fd, &st))
14-
len = st.st_size;
15-
else
12+
osfhandle = (HANDLE)_get_osfhandle(fd);
13+
if (!GetFileSizeEx(osfhandle, &len))
1614
die("mmap: could not determine filesize");
1715

18-
if ((length + offset) > len)
19-
length = xsize_t(len - offset);
16+
if ((length + offset) > len.QuadPart)
17+
length = xsize_t(len.QuadPart - offset);
2018

2119
if (!(flags & MAP_PRIVATE))
2220
die("Invalid usage of mmap when built with USE_WIN32_MMAP");
2321

24-
hmap = CreateFileMapping((HANDLE)_get_osfhandle(fd), NULL,
25-
PAGE_WRITECOPY, 0, 0, NULL);
22+
hmap = CreateFileMapping(osfhandle, NULL,
23+
prot == PROT_READ ? PAGE_READONLY : PAGE_WRITECOPY, 0, 0, NULL);
2624

27-
if (!hmap)
25+
if (!hmap) {
26+
errno = EINVAL;
2827
return MAP_FAILED;
28+
}
2929

30-
temp = MapViewOfFileEx(hmap, FILE_MAP_COPY, h, l, length, start);
30+
temp = MapViewOfFileEx(hmap, prot == PROT_READ ?
31+
FILE_MAP_READ : FILE_MAP_COPY, h, l, length, start);
3132

3233
if (!CloseHandle(hmap))
3334
warning("unable to close file mapping handle");
3435

35-
return temp ? temp : MAP_FAILED;
36+
if (temp)
37+
return temp;
38+
39+
errno = GetLastError() == ERROR_COMMITMENT_LIMIT ? EFBIG : EINVAL;
40+
return MAP_FAILED;
3641
}
3742

3843
int git_munmap(void *start, size_t length)

0 commit comments

Comments
 (0)