Avoid too-large shift on 32-bit Windows.
authorRobert Haas <rhaas@postgresql.org>
Wed, 30 Oct 2013 13:13:42 +0000 (09:13 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 30 Oct 2013 13:14:56 +0000 (09:14 -0400)
Apparently, shifts greater than or equal to the width of the type
are undefined, and can surprisingly produce a non-zero value.

Amit Kapila, with a comment by me.

src/backend/storage/ipc/dsm_impl.c

index 2056668ae99f568ffcec3e31315baaa9dc9cfe76..811ac0437ce52ef11fef6614837a0b3460231073 100644 (file)
@@ -673,8 +673,17 @@ dsm_impl_windows(dsm_op op, dsm_handle handle, Size request_size,
    /* Create new segment or open an existing one for attach. */
    if (op == DSM_OP_CREATE)
    {
-       DWORD       size_high = (DWORD) (request_size >> 32);
-       DWORD       size_low = (DWORD) request_size;
+       DWORD       size_high;
+       DWORD       size_low;
+
+       /* Shifts >= the width of the type are undefined. */
+#ifdef _WIN64
+       size_high = request_size >> 32;
+#else
+       size_high = 0;
+#endif
+       size_low = (DWORD) request_size;
+
        hmap = CreateFileMapping(INVALID_HANDLE_VALUE,  /* Use the pagefile */
                                 NULL,          /* Default security attrs */
                                 PAGE_READWRITE,    /* Memory is read/write */