Skip to content
  • Eric Blake's avatar
    42cc08d1
    cutils: Improve qemu_strtosz handling of fractions · 42cc08d1
    Eric Blake authored
    We have several limitations and bugs worth fixing; they are
    inter-related enough that it is not worth splitting this patch into
    smaller pieces:
    
    * ".5k" should work to specify 512, just as "0.5k" does
    * "1.9999k" and "1." + "9"*50 + "k" should both produce the same
      result of 2048 after rounding
    * "1." + "0"*350 + "1B" should not be treated the same as "1.0B";
      underflow in the fraction should not be lost
    * "7.99e99" and "7.99e999" look similar, but our code was doing a
      read-out-of-bounds on the latter because it was not expecting ERANGE
      due to overflow. While we document that scientific notation is not
      supported, and the previous patch actually fixed
      qemu_strtod_finite() to no longer return ERANGE overflows, it is
      easier to pre-filter than to try and determine after the fact if
      strtod() consumed more than we wanted.  Note that this is a
      low-level semantic change (when endptr is not NULL, we can now
      successfully parse with a scale of 'E' and then report trailing
      junk, instead of failing outright with EINVAL); but an earlier
      commit already argued that this is not a high-level semantic change
      since the only caller passing in a non-NULL endptr also checks that
      the tail is whitespace-only.
    
    Fixes: https://gitlab.com/qemu-project/qemu/-/issues/1629
    
    
    Fixes: cf923b78 ("utils: Improve qemu_strtosz() to have 64 bits of precision", 6.0.0)
    Fixes: 7625a1ed ("utils: Use fixed-point arithmetic in qemu_strtosz", 6.0.0)
    Signed-off-by: default avatarEric Blake <eblake@redhat.com>
    Reviewed-by: default avatarHanna Czenczek <hreitz@redhat.com>
    Message-Id: <20230522190441.64278-20-eblake@redhat.com>
    [eblake: tweak function comment for accuracy]
    42cc08d1
    cutils: Improve qemu_strtosz handling of fractions
    Eric Blake authored
    We have several limitations and bugs worth fixing; they are
    inter-related enough that it is not worth splitting this patch into
    smaller pieces:
    
    * ".5k" should work to specify 512, just as "0.5k" does
    * "1.9999k" and "1." + "9"*50 + "k" should both produce the same
      result of 2048 after rounding
    * "1." + "0"*350 + "1B" should not be treated the same as "1.0B";
      underflow in the fraction should not be lost
    * "7.99e99" and "7.99e999" look similar, but our code was doing a
      read-out-of-bounds on the latter because it was not expecting ERANGE
      due to overflow. While we document that scientific notation is not
      supported, and the previous patch actually fixed
      qemu_strtod_finite() to no longer return ERANGE overflows, it is
      easier to pre-filter than to try and determine after the fact if
      strtod() consumed more than we wanted.  Note that this is a
      low-level semantic change (when endptr is not NULL, we can now
      successfully parse with a scale of 'E' and then report trailing
      junk, instead of failing outright with EINVAL); but an earlier
      commit already argued that this is not a high-level semantic change
      since the only caller passing in a non-NULL endptr also checks that
      the tail is whitespace-only.
    
    Fixes: https://gitlab.com/qemu-project/qemu/-/issues/1629
    
    
    Fixes: cf923b78 ("utils: Improve qemu_strtosz() to have 64 bits of precision", 6.0.0)
    Fixes: 7625a1ed ("utils: Use fixed-point arithmetic in qemu_strtosz", 6.0.0)
    Signed-off-by: default avatarEric Blake <eblake@redhat.com>
    Reviewed-by: default avatarHanna Czenczek <hreitz@redhat.com>
    Message-Id: <20230522190441.64278-20-eblake@redhat.com>
    [eblake: tweak function comment for accuracy]
Loading