]> granicus.if.org Git - postgresql/commitdiff
Install a workaround for a longstanding gcc bug that allows SIGFPE traps
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 3 Sep 2009 18:48:14 +0000 (18:48 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 3 Sep 2009 18:48:14 +0000 (18:48 +0000)
to occur for division by zero, even though the code is carefully avoiding
that.  All available evidence is that the only functions affected are
int24div, int48div, and int28div, so patch just those three functions to
include a "return" after the ereport() call.

Backpatch to 8.4 so that the fix can be tested in production builds.
For older branches our recommendation will continue to be to use -O1
on affected platforms (which are mostly non-mainstream anyway).

src/backend/utils/adt/int.c
src/backend/utils/adt/int8.c

index 5214e29825c0f2e111ef25c0a290bba2e7a7cbd8..ad4df06572f8e5d4584ff04694dc81b3e7292309 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/int.c,v 1.84 2009/01/01 17:23:49 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/int.c,v 1.85 2009/09/03 18:48:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -950,9 +950,14 @@ int24div(PG_FUNCTION_ARGS)
        int32           arg2 = PG_GETARG_INT32(1);
 
        if (arg2 == 0)
+       {
                ereport(ERROR,
                                (errcode(ERRCODE_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 */
        PG_RETURN_INT32((int32) arg1 / arg2);
 }
index 89162f080ecfd2bf9695c214726fbdc43191365b..54a134d47785f460f70de6b7e68e91441c2a9e80 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/int8.c,v 1.74 2009/06/11 14:49:03 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/int8.c,v 1.75 2009/09/03 18:48:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -919,9 +919,14 @@ int48div(PG_FUNCTION_ARGS)
        int64           arg2 = PG_GETARG_INT64(1);
 
        if (arg2 == 0)
+       {
                ereport(ERROR,
                                (errcode(ERRCODE_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 */
        PG_RETURN_INT64((int64) arg1 / arg2);
 }
@@ -1098,9 +1103,14 @@ int28div(PG_FUNCTION_ARGS)
        int64           arg2 = PG_GETARG_INT64(1);
 
        if (arg2 == 0)
+       {
                ereport(ERROR,
                                (errcode(ERRCODE_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 */
        PG_RETURN_INT64((int64) arg1 / arg2);
 }