Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 171c0091 authored by Gregor Boirie's avatar Gregor Boirie Committed by Jonathan Cameron
Browse files

iio:core: fix IIO_VAL_FRACTIONAL sign handling



7985e7c1 ("iio: Introduce a new fractional value type") introduced a
new IIO_VAL_FRACTIONAL value type meant to represent rational type numbers
expressed by a numerator and denominator combination.

Formating of IIO_VAL_FRACTIONAL values relies upon do_div() usage. This
fails handling negative values properly since parameters are reevaluated
as unsigned values.
Fix this by using div_s64_rem() instead. Computed integer part will carry
properly signed value. Formatted fractional part will always be positive.

Fixes: 7985e7c1 ("iio: Introduce a new fractional value type")
Signed-off-by: default avatarGregor Boirie <gregor.boirie@parrot.com>
Reviewed-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Cc: <Stable@vger.kernel.org>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 5dba4b14
Loading
Loading
Loading
Loading
+2 −3
Original line number Original line Diff line number Diff line
@@ -613,9 +613,8 @@ ssize_t iio_format_value(char *buf, unsigned int type, int size, int *vals)
			return sprintf(buf, "%d.%09u\n", vals[0], vals[1]);
			return sprintf(buf, "%d.%09u\n", vals[0], vals[1]);
	case IIO_VAL_FRACTIONAL:
	case IIO_VAL_FRACTIONAL:
		tmp = div_s64((s64)vals[0] * 1000000000LL, vals[1]);
		tmp = div_s64((s64)vals[0] * 1000000000LL, vals[1]);
		vals[1] = do_div(tmp, 1000000000LL);
		vals[0] = (int)div_s64_rem(tmp, 1000000000, &vals[1]);
		vals[0] = tmp;
		return sprintf(buf, "%d.%09u\n", vals[0], abs(vals[1]));
		return sprintf(buf, "%d.%09u\n", vals[0], vals[1]);
	case IIO_VAL_FRACTIONAL_LOG2:
	case IIO_VAL_FRACTIONAL_LOG2:
		tmp = (s64)vals[0] * 1000000000LL >> vals[1];
		tmp = (s64)vals[0] * 1000000000LL >> vals[1];
		vals[1] = do_div(tmp, 1000000000LL);
		vals[1] = do_div(tmp, 1000000000LL);