Changeset: 32552a0ea57f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=32552a0ea57f Modified Files: sql/server/rel_select.c Branch: Oct2020 Log Message:
add some more scale overflow checks diffs (68 lines): diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -1327,7 +1327,7 @@ exp_scale_algebra(mvc *sql, sql_subfunc if (lt->type->scale == SCALE_FIX && rt->scale && strcmp(f->func->imp, "/") == 0) { sql_subtype *res = f->res->h->data; - int scale, digits, digL, scaleL; + unsigned int scale, digits, digL, scaleL; sql_subtype nlt; /* scale fixing may require a larger type ! */ @@ -1335,7 +1335,7 @@ exp_scale_algebra(mvc *sql, sql_subfunc scale = scaleL; scaleL += rt->scale; digL = lt->digits + (scaleL - lt->scale); - digits = (digL > (int)rt->digits) ? digL : (int)rt->digits; + digits = (digL > rt->digits) ? digL : rt->digits; /* HACK alert: digits should be less than max */ #ifdef HAVE_HGE @@ -1351,6 +1351,10 @@ exp_scale_algebra(mvc *sql, sql_subfunc #endif sql_find_subtype(&nlt, lt->type->sqlname, digL, scaleL); + if (nlt.digits < scaleL) { + sql_error(sql, 01, SQLSTATE(42000) "Scale (%d) overflows type", scaleL); + return NULL; + } l = exp_check_type( sql, &nlt, rel, l, type_equal); sql_find_subtype(res, lt->type->sqlname, digits, scale); @@ -2285,7 +2289,7 @@ rel_logical_value_exp(sql_query *query, if (!(re2 = rel_value_exp(query, rel, ro2, f, ek))) return NULL; - if (exp_between_check_types(&super, exp_subtype(le), exp_subtype(re1), exp_subtype(re2)) < 0) + if (exp_between_check_types(&super, exp_subtype(le), exp_subtype(re1), exp_subtype(re2)) < 0) return sql_error(sql, 01, SQLSTATE(42000) "Cannot have a parameter (?) on both sides of an expression"); if ((le = exp_check_type(sql, &super, rel ? *rel:NULL, le, type_equal)) == NULL || @@ -2540,7 +2544,7 @@ rel_logical_exp(sql_query *query, sql_re if (!(re2 = rel_value_exp(query, &rel, ro2, f, ek))) return NULL; - if (exp_between_check_types(&super, exp_subtype(le), exp_subtype(re1), exp_subtype(re2)) < 0) + if (exp_between_check_types(&super, exp_subtype(le), exp_subtype(re1), exp_subtype(re2)) < 0) return sql_error(sql, 01, SQLSTATE(42000) "Cannot have a parameter (?) on both sides of an expression"); if ((le = exp_check_type(sql, &super, rel, le, type_equal)) == NULL || @@ -2886,6 +2890,8 @@ rel_binop_(mvc *sql, sql_rel *rel, sql_e r = exp_fix_scale(sql, t2, r, 0, 0); } else if (f->func->fix_scale == SCALE_DIV) { l = exp_scale_algebra(sql, f, rel, l, r); + if (!l) + return NULL; } else if (f->func->fix_scale == SCALE_MUL) { exp_sum_scales(f, l, r); } else if (f->func->fix_scale == DIGITS_ADD) { @@ -2989,6 +2995,8 @@ rel_binop_(mvc *sql, sql_rel *rel, sql_e r = exp_fix_scale(sql, t2, r, 0, 0); } else if (f->func->fix_scale == SCALE_DIV) { l = exp_scale_algebra(sql, f, rel, l, r); + if (!l) + return NULL; } else if (f->func->fix_scale == SCALE_MUL) { exp_sum_scales(f, l, r); } else if (f->func->fix_scale == DIGITS_ADD) { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list