aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/datetime.c
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2014-01-30 09:41:43 -0500
committerBruce Momjian <bruce@momjian.us>2014-01-30 09:41:43 -0500
commit146604ec43bcd6f977c31775a91022cf9737daf5 (patch)
tree2b8f94e63f29c968c77e31075d3648fb9033a923 /src/backend/utils/adt/datetime.c
parent571addd729a400cece396d79696adcc63387e43b (diff)
downloadpostgresql-146604ec43bcd6f977c31775a91022cf9737daf5.tar.gz
postgresql-146604ec43bcd6f977c31775a91022cf9737daf5.zip
Add checks for interval overflow/underflow
New checks include input, month/day/time internal adjustments, addition, subtraction, multiplication, and negation. Also adjust docs to correctly specify interval size in bytes. Report from Rok Kralj
Diffstat (limited to 'src/backend/utils/adt/datetime.c')
-rw-r--r--src/backend/utils/adt/datetime.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c
index a61b40e17f9..946adfad997 100644
--- a/src/backend/utils/adt/datetime.c
+++ b/src/backend/utils/adt/datetime.c
@@ -2976,6 +2976,9 @@ DecodeInterval(char **field, int *ftype, int nf, int range,
type = DTK_MONTH;
if (*field[i] == '-')
val2 = -val2;
+ if (((double)val * MONTHS_PER_YEAR + val2) > INT_MAX ||
+ ((double)val * MONTHS_PER_YEAR + val2) < INT_MIN)
+ return DTERR_FIELD_OVERFLOW;
val = val * MONTHS_PER_YEAR + val2;
fval = 0;
}