• Jiri Popelka's avatar
    ifconfig can incorrectly round PiB · e5f1be13
    Jiri Popelka authored
    When an interface has transferred exbibytes
    (> 0.8 EiB, i.e. > 819 PiB) of traffic,
    the short display is rounded incorrectly.
    
    For example:
    bytes 2154408931384050514 (275.0 PiB)
    while correct is (1913.4 PiB)
    
    This happens because we times the rx/tx bytes values by 10,
    then calculate the short version from that result:
    
    lib/interface.c:ife_print_long()
    
    tx = ptr->stats.tx_bytes;
    short_tx = tx * 10;
    if (tx > 1125899906842624ull) {
      short_tx /= 1125899906842624ull;
      Text = "PiB";
    }
    
    But multiplying anything more than 819 PiB by 10 overflows a ull
    which is a uint64_t (max value of 9223372036854775807).
    
    We'll never get accuracy over 8192 PiB (2^64) when using ull,
    but we can at least correctly handle values between 819 - 8192 PiB.
    e5f1be13
interface.c 24.1 KB