diff mbox series

maketable: Add check for ZERO for variable sigma2

Message ID 20240106211422.33967-1-maks.mishinFZ@gmail.com (mailing list archive)
State Changes Requested
Delegated to: Stephen Hemminger
Headers show
Series maketable: Add check for ZERO for variable sigma2 | expand

Checks

Context Check Description
netdev/tree_selection success Not a local patch

Commit Message

Maks Mishin Jan. 6, 2024, 9:14 p.m. UTC
If variable `limit` == 1, then `n` == 1 and then second for-loop will
not do because of variable `sigma2` maybe ZERO.
Added check for ZERO for `sigma2` before it is used as denominator.

Signed-off-by: Maks Mishin <maks.mishinFZ@gmail.com>
---
 netem/maketable.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Stephen Hemminger Jan. 8, 2024, 5:27 p.m. UTC | #1
On Sun,  7 Jan 2024 00:14:22 +0300
Maks Mishin <maks.mishinfz@gmail.com> wrote:

> If variable `limit` == 1, then `n` == 1 and then second for-loop will
> not do because of variable `sigma2` maybe ZERO.
> Added check for ZERO for `sigma2` before it is used as denominator.
> 
> Signed-off-by: Maks Mishin <maks.mishinFZ@gmail.com>
> ---
>  netem/maketable.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/netem/maketable.c b/netem/maketable.c
> index ad8620a4..56b1d0bb 100644
> --- a/netem/maketable.c
> +++ b/netem/maketable.c
> @@ -68,6 +68,10 @@ arraystats(double *x, int limit, double *mu, double *sigma, double *rho)
>  		sigma2 += ((double)x[i-1] - *mu)*((double)x[i-1] - *mu);
>  
>  	}
> +	if (sigma2 == 0) {
> +		perror("Division by zero in top/sigma2");
> +		exit(3);
> +	}
>  	*rho = top/sigma2;
>  }
>  

This looks like a purely theoretical not practical problem.
Just tried the tool with input files likely to create the problem (no data, one sample, etc)
and could not reproduce any problem.

What input could make this happen?
diff mbox series

Patch

diff --git a/netem/maketable.c b/netem/maketable.c
index ad8620a4..56b1d0bb 100644
--- a/netem/maketable.c
+++ b/netem/maketable.c
@@ -68,6 +68,10 @@  arraystats(double *x, int limit, double *mu, double *sigma, double *rho)
 		sigma2 += ((double)x[i-1] - *mu)*((double)x[i-1] - *mu);
 
 	}
+	if (sigma2 == 0) {
+		perror("Division by zero in top/sigma2");
+		exit(3);
+	}
 	*rho = top/sigma2;
 }