X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fregression.c;h=e08f4a1d76f051b4686f3d4a1b19cd00cee725f7;hb=dfbfb507fd6facfe202aba3c981e8922bffa105b;hp=28618f12b0a89a2a04a04b10d2f8bd6425d20cc2;hpb=9420449c40bb1307f6c31e50b61ba03825680e3a;p=pspp diff --git a/src/language/stats/regression.c b/src/language/stats/regression.c index 28618f12b0..e08f4a1d76 100644 --- a/src/language/stats/regression.c +++ b/src/language/stats/regression.c @@ -175,14 +175,14 @@ save_trans_func (void *aux, struct ccase **c, casenumber x UNUSED) { if (ws->pred_idx != -1) { - double pred = case_data_idx (in, ws->extras * k + ws->pred_idx)->f; - case_data_rw (*c, ws->predvars[k])->f = pred; + double pred = case_num_idx (in, ws->extras * k + ws->pred_idx); + *case_num_rw (*c, ws->predvars[k]) = pred; } if (ws->res_idx != -1) { - double resid = case_data_idx (in, ws->extras * k + ws->res_idx)->f; - case_data_rw (*c, ws->residvars[k])->f = resid; + double resid = case_num_idx (in, ws->extras * k + ws->res_idx); + *case_num_rw (*c, ws->residvars[k]) = resid; } } case_unref (in); @@ -671,8 +671,7 @@ run_regression_get_models (const struct regression *cmd, bool output) { size_t i; - struct linreg **models = NULL; - struct model_container *model_container = xzalloc (sizeof (*model_container) * cmd->n_vars); + struct model_container *model_container = XCALLOC (cmd->n_vars, struct model_container); struct ccase *c; struct covariance *cov; @@ -706,8 +705,13 @@ run_regression_get_models (const struct regression *cmd, size_t n_all_vars = get_n_all_vars (cmd); const struct variable **all_vars = xnmalloc (n_all_vars, sizeof (*all_vars)); - double *means = xnmalloc (n_all_vars, sizeof (*means)); - + /* In the (rather pointless) case where the dependent variable is + the independent variable, n_all_vars == 1. + However this would result in a buffer overflow so we must + over-allocate the space required in this malloc call. + See bug #58599 */ + double *means = xnmalloc (n_all_vars <= 1 ? 2 : n_all_vars, + sizeof (*means)); fill_all_vars (all_vars, cmd); cov = covariance_1pass_create (n_all_vars, all_vars, dict_get_weight (dataset_dict (cmd->ds)), @@ -726,7 +730,7 @@ run_regression_get_models (const struct regression *cmd, casereader_destroy (r); } - models = xcalloc (cmd->n_dep_vars, sizeof (*models)); + struct linreg **models = XCALLOC (cmd->n_dep_vars, struct linreg*); for (int k = 0; k < cmd->n_dep_vars; k++) { @@ -822,14 +826,14 @@ run_regression (const struct regression *cmd, if (cmd->pred) { double pred = linreg_predict (models[k], vals, n_indep); - case_data_rw_idx (outc, k * ws->extras + ws->pred_idx)->f = pred; + *case_num_rw_idx (outc, k * ws->extras + ws->pred_idx) = pred; } if (cmd->resid) { - double obs = case_data (c, linreg_dep_var (models[k]))->f; + double obs = case_num (c, linreg_dep_var (models[k])); double res = linreg_residual (models[k], obs, vals, n_indep); - case_data_rw_idx (outc, k * ws->extras + ws->res_idx)->f = res; + *case_num_rw_idx (outc, k * ws->extras + ws->res_idx) = res; } free (vals); free (vars);