Linux-IIO Archive on lore.kernel.org
 help / color / Atom feed
* [LINUX PATCH v3] iio: core: Fix IIO_VAL_FRACTIONAL calculation for negative values
@ 2020-10-05 15:05 Anand Ashok Dumbre
  2020-10-10 16:54 ` Jonathan Cameron
  0 siblings, 1 reply; 2+ messages in thread
From: Anand Ashok Dumbre @ 2020-10-05 15:05 UTC (permalink / raw)
  To: jic23, knaack.h, lars, pmeerw, michal.simek, git, linux-iio,
	linux-arm-kernel, linux-kernel
  Cc: anandash, Anand Ashok Dumbre

Fixes IIO_VAL_FRACTIONAL for case when the result is negative and
exponent is 0.

example: if the result is -0.75, tmp0 will be 0 and tmp1 = 75
This causes the output to lose sign because of %d in snprintf
which works for tmp0 <= -1.

Signed-off-by: Anand Ashok Dumbre <anand.ashok.dumbre@xilinx.com>
Reported-by: kernel test robot <lkp@intel.com> #error: uninitialized symbol tmp
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
---

Changes in v3:
	Fixed a bug caught by kernel test robot and used correct variable

---
 drivers/iio/industrialio-core.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index cdcd16f1..ffd5176 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -592,6 +592,7 @@ static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type,
 {
 	unsigned long long tmp;
 	int tmp0, tmp1;
+	s64 tmp2;
 	bool scale_db = false;
 
 	switch (type) {
@@ -614,10 +615,13 @@ static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type,
 		else
 			return scnprintf(buf, len, "%d.%09u", vals[0], vals[1]);
 	case IIO_VAL_FRACTIONAL:
-		tmp = div_s64((s64)vals[0] * 1000000000LL, vals[1]);
+		tmp2 = div_s64((s64)vals[0] * 1000000000LL, vals[1]);
 		tmp1 = vals[1];
-		tmp0 = (int)div_s64_rem(tmp, 1000000000, &tmp1);
-		return scnprintf(buf, len, "%d.%09u", tmp0, abs(tmp1));
+		tmp0 = (int)div_s64_rem(tmp2, 1000000000, &tmp1);
+		if ((tmp2 < 0) && (tmp0 == 0))
+			return snprintf(buf, len, "-0.%09u", abs(tmp1));
+		else
+			return snprintf(buf, len, "%d.%09u", tmp0, abs(tmp1));
 	case IIO_VAL_FRACTIONAL_LOG2:
 		tmp = shift_right((s64)vals[0] * 1000000000LL, vals[1]);
 		tmp0 = (int)div_s64_rem(tmp, 1000000000LL, &tmp1);
-- 
2.7.4


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [LINUX PATCH v3] iio: core: Fix IIO_VAL_FRACTIONAL calculation for negative values
  2020-10-05 15:05 [LINUX PATCH v3] iio: core: Fix IIO_VAL_FRACTIONAL calculation for negative values Anand Ashok Dumbre
@ 2020-10-10 16:54 ` Jonathan Cameron
  0 siblings, 0 replies; 2+ messages in thread
From: Jonathan Cameron @ 2020-10-10 16:54 UTC (permalink / raw)
  To: Anand Ashok Dumbre
  Cc: knaack.h, lars, pmeerw, michal.simek, git, linux-iio,
	linux-arm-kernel, linux-kernel, anandash

On Mon,  5 Oct 2020 08:05:16 -0700
Anand Ashok Dumbre <anand.ashok.dumbre@xilinx.com> wrote:

> Fixes IIO_VAL_FRACTIONAL for case when the result is negative and
> exponent is 0.
> 
> example: if the result is -0.75, tmp0 will be 0 and tmp1 = 75
> This causes the output to lose sign because of %d in snprintf
> which works for tmp0 <= -1.
> 
> Signed-off-by: Anand Ashok Dumbre <anand.ashok.dumbre@xilinx.com>
> Reported-by: kernel test robot <lkp@intel.com> #error: uninitialized symbol tmp
> Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
As this doesn't have a fixes tag etc and from v2 discussion was only hit
with a new driver, I'm not currently taking this a a fix.
If people want me to rush it in / backport to stable then let me know

Applied to the togreg branch of iio.git and pushed out as testing for
the autobuilders to poke at it.

Thanks,

Jonathan

> ---
> 
> Changes in v3:
> 	Fixed a bug caught by kernel test robot and used correct variable
> 
> ---
>  drivers/iio/industrialio-core.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
> index cdcd16f1..ffd5176 100644
> --- a/drivers/iio/industrialio-core.c
> +++ b/drivers/iio/industrialio-core.c
> @@ -592,6 +592,7 @@ static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type,
>  {
>  	unsigned long long tmp;
>  	int tmp0, tmp1;
> +	s64 tmp2;
>  	bool scale_db = false;
>  
>  	switch (type) {
> @@ -614,10 +615,13 @@ static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type,
>  		else
>  			return scnprintf(buf, len, "%d.%09u", vals[0], vals[1]);
>  	case IIO_VAL_FRACTIONAL:
> -		tmp = div_s64((s64)vals[0] * 1000000000LL, vals[1]);
> +		tmp2 = div_s64((s64)vals[0] * 1000000000LL, vals[1]);
>  		tmp1 = vals[1];
> -		tmp0 = (int)div_s64_rem(tmp, 1000000000, &tmp1);
> -		return scnprintf(buf, len, "%d.%09u", tmp0, abs(tmp1));
> +		tmp0 = (int)div_s64_rem(tmp2, 1000000000, &tmp1);
> +		if ((tmp2 < 0) && (tmp0 == 0))
> +			return snprintf(buf, len, "-0.%09u", abs(tmp1));
> +		else
> +			return snprintf(buf, len, "%d.%09u", tmp0, abs(tmp1));
>  	case IIO_VAL_FRACTIONAL_LOG2:
>  		tmp = shift_right((s64)vals[0] * 1000000000LL, vals[1]);
>  		tmp0 = (int)div_s64_rem(tmp, 1000000000LL, &tmp1);


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, back to index

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-05 15:05 [LINUX PATCH v3] iio: core: Fix IIO_VAL_FRACTIONAL calculation for negative values Anand Ashok Dumbre
2020-10-10 16:54 ` Jonathan Cameron

Linux-IIO Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-iio/0 linux-iio/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-iio linux-iio/ https://lore.kernel.org/linux-iio \
		linux-iio@vger.kernel.org
	public-inbox-index linux-iio

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-iio


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git