From 11ae25941a4c942b7ad4bcacf86cbeeed83f74d8 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sun, 25 Nov 2018 17:52:29 -0800 Subject: [PATCH] FREQUENCIES: Avoid buffer overrun when there is no valid data. Reported by Address Sanitizer. --- src/language/stats/frequencies.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/language/stats/frequencies.c b/src/language/stats/frequencies.c index 3e4455f2b2..0a1a060d26 100644 --- a/src/language/stats/frequencies.c +++ b/src/language/stats/frequencies.c @@ -407,7 +407,9 @@ calc_percentiles (const struct frq_proc *frq, const struct var_freqs *vf) for (; percentile_idx < frq->n_percentiles; percentile_idx++) { struct percentile *pc = &frq->percentiles[percentile_idx]; - pc->value = ft->valid[ft->n_valid - 1].values[0].f; + pc->value = (ft->n_valid > 0 + ? ft->valid[ft->n_valid - 1].values[0].f + : SYSMIS); } } @@ -1543,10 +1545,19 @@ calc_stats (const struct var_freqs *vf, double d[FRQ_ST_count]) moments_destroy (m); /* Formulae below are taken from _SPSS Statistical Algorithms_. */ - d[FRQ_ST_MINIMUM] = ft->valid[0].values[0].f; - d[FRQ_ST_MAXIMUM] = ft->valid[ft->n_valid - 1].values[0].f; + if (ft->n_valid > 0) + { + d[FRQ_ST_MINIMUM] = ft->valid[0].values[0].f; + d[FRQ_ST_MAXIMUM] = ft->valid[ft->n_valid - 1].values[0].f; + d[FRQ_ST_RANGE] = d[FRQ_ST_MAXIMUM] - d[FRQ_ST_MINIMUM]; + } + else + { + d[FRQ_ST_MINIMUM] = SYSMIS; + d[FRQ_ST_MAXIMUM] = SYSMIS; + d[FRQ_ST_RANGE] = SYSMIS; + } d[FRQ_ST_MODE] = X_mode; - d[FRQ_ST_RANGE] = d[FRQ_ST_MAXIMUM] - d[FRQ_ST_MINIMUM]; d[FRQ_ST_SUM] = d[FRQ_ST_MEAN] * W; d[FRQ_ST_STDDEV] = sqrt (d[FRQ_ST_VARIANCE]); d[FRQ_ST_SEMEAN] = d[FRQ_ST_STDDEV] / sqrt (W); -- 2.30.2