diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-08-06 21:26:31 +0300 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-08-06 22:51:37 +0300 |
| commit | 8bea70c68e3f7ac23d4ff10b758af718ffb94263 (patch) | |
| tree | fa0acc0c76dce541911cd9095c5c78aec31e9f71 /src/platform/windows/win_file.c | |
| parent | b717dfefa5b1e8fa20ded02f3a79e2c8d2f24f41 (diff) | |
| download | nng-8bea70c68e3f7ac23d4ff10b758af718ffb94263.tar.gz nng-8bea70c68e3f7ac23d4ff10b758af718ffb94263.tar.bz2 nng-8bea70c68e3f7ac23d4ff10b758af718ffb94263.zip | |
fixes #611 Memory Leaks under Windows
fixes #622 incorrect assumptions about malloc(0)
Windows actually allocates an object of size zero when calling
malloc on size zero. This is unusual behavior, and we just
add logic to work more like malloc on POSIX systems.
Other systems can return non-NULL objects to fixed pages here.
We think the best option here is to uniformly return NULL from
our APIs in these circumstances, and to include testing to validate
that.
Diffstat (limited to 'src/platform/windows/win_file.c')
| -rw-r--r-- | src/platform/windows/win_file.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/platform/windows/win_file.c b/src/platform/windows/win_file.c index 3b6461a6..47bb87af 100644 --- a/src/platform/windows/win_file.c +++ b/src/platform/windows/win_file.c @@ -136,14 +136,19 @@ nni_plat_file_get(const char *name, void **datap, size_t *lenp) rv = nni_win_error(GetLastError()); goto done; } - if ((data = nni_alloc((size_t) sz)) == NULL) { - rv = NNG_ENOMEM; - goto done; - } - if (!ReadFile(h, data, sz, &nread, NULL)) { - rv = nni_win_error(GetLastError()); - nni_free(data, sz); - goto done; + if (sz > 0) { + if ((data = nni_alloc((size_t) sz)) == NULL) { + rv = NNG_ENOMEM; + goto done; + } + if (!ReadFile(h, data, sz, &nread, NULL)) { + rv = nni_win_error(GetLastError()); + nni_free(data, sz); + goto done; + } + } else { + data = NULL; + nread = 0; } // We can get a short read, indicating end of file. We return |
