From b3be317e1f147298da295ebcb423f6d26d4a830c Mon Sep 17 00:00:00 2001 From: Thomas White Date: Mon, 16 Jan 2023 14:41:16 +0100 Subject: asdf: Avoid integer overflow with number of triplets Co-authored-by: Alexandra Tolstikova Fixes: https://gitlab.desy.de/thomas.white/crystfel/-/issues/76 --- libcrystfel/src/indexers/asdf.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'libcrystfel') diff --git a/libcrystfel/src/indexers/asdf.c b/libcrystfel/src/indexers/asdf.c index 39e8c5be..4473b3f2 100644 --- a/libcrystfel/src/indexers/asdf.c +++ b/libcrystfel/src/indexers/asdf.c @@ -887,9 +887,9 @@ long nCk(int n, int k) { assert(k>=0 && k<4); switch ( k ) { case 0 : return 1; - case 1 : return n; - case 2 : return n*(n-1)/2; - case 3 : return n*(n-1)*(n-2)/6; + case 1 : return (long)n; + case 2 : return (long)n*(n-1)/2; + case 3 : return (long)n*(n-1)*(n-2)/6; } return 0; } @@ -918,11 +918,13 @@ void get_triplet_by_index(int index, int n, int *triplet) { static int **generate_triplets(int N_reflections, int N_triplets_max, int *N) { int i, n, ri; - int N_triplets_tot = nCk(N_reflections, 3); + long int N_triplets_tot = nCk(N_reflections, 3); - int N_triplets = N_triplets_tot; - if ( N_triplets > N_triplets_max || N_reflections > 1000 ) { + int N_triplets; + if ( N_triplets_tot > N_triplets_max || N_reflections > 1000 ) { N_triplets = N_triplets_max; + } else { + N_triplets = N_triplets_tot; } *N = N_triplets; -- cgit v1.2.3