Skip to content
  • Torsten Bögershausen's avatar
    remote-curl.c: xcurl_off_t is not portable (on 32 bit platfoms) · cb8010bb
    Torsten Bögershausen authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When  setting
    DEVELOPER = 1
    DEVOPTS = extra-all
    
    "gcc (Raspbian 6.3.0-18+rpi1+deb9u1) 6.3.0 20170516" errors out with
    "comparison is always false due to limited range of data type"
    "[-Werror=type-limits]"
    
    It turns out that the function xcurl_off_t() has 2 flavours:
    
    - It gives a warning 32 bit systems, like Linux
    - It takes the signed ssize_t as a paramter, but the only caller is using
      a size_t (which is typically unsigned these days)
    
    The original motivation of this function is to make sure that sizes > 2GiB
    are handled correctly. The curl documentation says:
    "For any given platform/compiler curl_off_t must be typedef'ed to a 64-bit
     wide signed integral data type"
    On a 32 bit system "size_t" can be promoted into a 64 bit signed value
    without loss of data, and therefore we may see the
    "comparison is always false" warning.
    On a 64 bit system it may happen, at least in theory, that size_t is > 2^63,
    and then the promotion from an unsigned "size_t" into a signed "curl_off_t"
    may be a problem.
    
    One solution to suppress a possible compiler warning could be to remove
    the function xcurl_off_t().
    
    However, to be on the very safe side, we keep it and improve it:
    
    - The len parameter is changed from ssize_t to size_t
    - A temporally variable "size" is used, promoted int uintmax_t and the compared
      with "maximum_signed_value_of_type(curl_off_t)".
      Thanks to Junio C Hamano for this hint.
    
    Signed-off-by: default avatarTorsten Bögershausen <tboegi@web.de>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    cb8010bb