aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-09-23 10:09:52 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-09-23 10:09:52 -0400
commite7f5d8ea1c75cc341a966897760a812e437c4668 (patch)
treeabddd5fc41bb6d5677a95e011795ae2a1f0396f5
parentb251379fb44b4893624999f1ba00986c029f11cf (diff)
downloadpostgresql-e7f5d8ea1c75cc341a966897760a812e437c4668.tar.gz
postgresql-e7f5d8ea1c75cc341a966897760a812e437c4668.zip
Don't trust CreateFileMapping() to clear the error code on success.
We must test GetLastError() even when CreateFileMapping() returns a non-null handle. If that value were left over from some previous system call, we might be fooled into thinking the segment already existed. Experimentation on Windows 7 suggests that CreateFileMapping() clears the error code on success, but it is not documented to do so, so let's not rely on that happening in all Windows releases. Amit Kapila Discussion: <20811.1474390987@sss.pgh.pa.us>
-rw-r--r--src/backend/storage/ipc/dsm_impl.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/backend/storage/ipc/dsm_impl.c b/src/backend/storage/ipc/dsm_impl.c
index 9cc9c5d2c29..8c706aee002 100644
--- a/src/backend/storage/ipc/dsm_impl.c
+++ b/src/backend/storage/ipc/dsm_impl.c
@@ -681,6 +681,9 @@ dsm_impl_windows(dsm_op op, dsm_handle handle, Size request_size,
#endif
size_low = (DWORD) request_size;
+ /* CreateFileMapping might not clear the error code on success */
+ SetLastError(0);
+
hmap = CreateFileMapping(INVALID_HANDLE_VALUE, /* Use the pagefile */
NULL, /* Default security attrs */
PAGE_READWRITE, /* Memory is read/write */