RTS: Fix restrictive cast
authorAlec Theriault <alec.theriault@gmail.com>
Mon, 13 May 2019 22:31:56 +0000 (15:31 -0700)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Wed, 22 May 2019 20:48:45 +0000 (16:48 -0400)
Commit e75a9afd2989e0460f9b49fa07c1667299d93ee9 added an `unsigned` cast
to account for OSes that have signed `rlim_t` signed. Unfortunately,
the `unsigned` cast has the unintended effect of narrowing `rlim_t` to
only 4 bytes. This leads to some spurious out of memory crashes
(in particular: Haddock crashes with OOM whenn building docs of
`ghc`-the-library).

In this case, `W_` is a better type to cast to: we know it will be
unsigned too and it has the same type as `*len` (so we don't suffer from
accidental narrowing).

rts/posix/OSMem.c

index 4e5c5c1..cf4b705 100644 (file)
@@ -550,8 +550,8 @@ void *osReserveHeapMemory(void *startAddressPtr, W_ *len)
      * explicitly cast to avoid sign compare error */
     if (!getrlimit(RLIMIT_AS, &limit)
         && limit.rlim_cur > 0
-        && *len > (unsigned) limit.rlim_cur) {
-        *len = (unsigned) limit.rlim_cur;
+        && *len > (W_) limit.rlim_cur) {
+        *len = (W_) limit.rlim_cur;
     }
 #endif