1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-18 17:42:25 +03:00

Put in some more safeguards against executing a division-by-zero.

Add dummy returns before every potential division-by-zero in int8.c,
because apparently further "improvements" in gcc's optimizer have
enabled it to break functions that weren't broken before.

Aurelien Jarno, via Martin Pitt
This commit is contained in:
Tom Lane
2011-03-11 18:18:59 -05:00
parent 2f418e8a17
commit 03aab8262a

View File

@ -592,9 +592,13 @@ int8div(PG_FUNCTION_ARGS)
int64 result; int64 result;
if (arg2 == 0) if (arg2 == 0)
{
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO), (errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("division by zero"))); errmsg("division by zero")));
/* ensure compiler realizes we mustn't reach the division (gcc bug) */
PG_RETURN_NULL();
}
result = arg1 / arg2; result = arg1 / arg2;
@ -639,9 +643,14 @@ int8mod(PG_FUNCTION_ARGS)
int64 arg2 = PG_GETARG_INT64(1); int64 arg2 = PG_GETARG_INT64(1);
if (arg2 == 0) if (arg2 == 0)
{
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO), (errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("division by zero"))); errmsg("division by zero")));
/* ensure compiler realizes we mustn't reach the division (gcc bug) */
PG_RETURN_NULL();
}
/* No overflow is possible */ /* No overflow is possible */
PG_RETURN_INT64(arg1 % arg2); PG_RETURN_INT64(arg1 % arg2);
@ -815,9 +824,13 @@ int84div(PG_FUNCTION_ARGS)
int64 result; int64 result;
if (arg2 == 0) if (arg2 == 0)
{
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO), (errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("division by zero"))); errmsg("division by zero")));
/* ensure compiler realizes we mustn't reach the division (gcc bug) */
PG_RETURN_NULL();
}
result = arg1 / arg2; result = arg1 / arg2;
@ -999,9 +1012,13 @@ int82div(PG_FUNCTION_ARGS)
int64 result; int64 result;
if (arg2 == 0) if (arg2 == 0)
{
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO), (errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("division by zero"))); errmsg("division by zero")));
/* ensure compiler realizes we mustn't reach the division (gcc bug) */
PG_RETURN_NULL();
}
result = arg1 / arg2; result = arg1 / arg2;