[lvm-devel] number conversion in lvm

Mikulas Patocka mpatocka at redhat.com
Mon Jul 15 20:10:55 UTC 2013



On Sat, 13 Jul 2013, Zdenek Kabelac wrote:

> Dne 13.7.2013 01:11, Mikulas Patocka napsal(a):
> > Hi
> > 
> > I found some strange code in _get_int_arg in ./tools/lvmcmdline.c:
> > 
> > v = strtol(val, ptr, 10);
> > 
> > if (*ptr == val)
> >          return 0;
> > 
> > av->i_value = (int32_t) v;
> > av->ui_value = (uint32_t) v;
> > av->i64_value = (int64_t) v;
> > av->ui64_value = (uint64_t) v;
> > 
> > It is taking 32-bit long value and then casting it to 64 bits. Should
> > there be strtoull instead of strtol?
> 
> It used to read only 32bit values.
> For 64bit other functions are used - i.e.  _size_arg

In tools/pvck.c there is "arg_uint64_value(cmd, labelsector_ARG,", but 
labelsector_ARG is declared with "arg(labelsector_ARG, '\0', 
"labelsector", int_arg, 0)", so there is loss of values that do not fit 
into long type.

> > BTW. how is that function supposed to handle integer overflow - it doesn't
> > seem to do that.
> > 
> 
> it returns  LONG_MIN/MAX for underflow/overflow - but assuming errno could
> be checked for ERANGE and fail command for this case instead.
> 
> Zdenek

The major problem is that the same function _get_int_arg parses both 
32-bit and 64-bit arguments. It would be natural to return error on 
integer overflow but you can't because you don't know if the caller will 
use the 32-bit value or the 64-bit value.

Another question is why there is av->i_value and av->ui_value when the 
values are the same and not dependent on the sign? What if the value fits 
into av->ui_value and doesn't fit into av->i_value - the overflow is never 
detected. This argument parser just seems totally confusing.

Mikulas




More information about the lvm-devel mailing list