Skip to content
  • Niklas Hambüchen's avatar
    base: fdReady(): Fix timeouts > ~49 days overflowing. Fixes #14262. · f209e667
    Niklas Hambüchen authored and Ben Gamari's avatar Ben Gamari committed
    On 64-bit UNIX and Windows, Haskell `Int` has 64 bits
    but C `int msecs` has 32 bits, resulting in an overflow.
    
    This commit fixes it by switching fdReady() to take int64_t,
    into which a Haskell `Int` will always fit.
    
    (Note we could not switch to `long long` because that is
    32 bit on 64-bit Windows machines.)
    
    Further, to be able to actually wait longer than ~49 days,
    we put loops around the waiting syscalls (they all accept only
    32-bit integers).
    
    Note the timer signal would typically interrupt the syscalls
    before the ~49 days are over, but you can run Haskell programs
    without the timer signal, an we want it to be correct in all
    cases.
    
    Reviewers: bgamari, austin, hvr, NicolasT, Phyx
    
    Reviewed By: bgamari, Phyx
    
    Subscribers: syd, Phyx, rwbarton, thomie
    
    GHC Trac Issues: #14262
    
    Differential Revision: https://phabricator.haskell.org/D4011
    f209e667