FREQUENCIES: Avoid buffer overrun when there is no valid data.
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 26 Nov 2018 01:52:29 +0000 (17:52 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 26 Nov 2018 06:12:32 +0000 (22:12 -0800)
Reported by Address Sanitizer.

src/language/stats/frequencies.c

index 3e4455f2b2d4ba910f5f75d45f0190f669b7052a..0a1a060d26c5ff440b9031a79b30927661f8aba4 100644 (file)
@@ -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);