Skip to content

Commit 3a4e929

Browse files
committed
Fix datetime input functions to correctly detect integer overflow when
running on a 64-bit platform ... strtol() will happily return 64-bit output in that case. Per bug #4231 from Geoff Tolley.
1 parent 5862cda commit 3a4e929

File tree

1 file changed

+29
-12
lines changed

1 file changed

+29
-12
lines changed

src/backend/utils/adt/datetime.c

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.189 2008/05/12 00:00:51 alvherre Exp $
11+
* $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.190 2008/06/09 19:34:02 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -255,6 +255,23 @@ static const datetkn *datecache[MAXDATEFIELDS] = {NULL};
255255
static const datetkn *deltacache[MAXDATEFIELDS] = {NULL};
256256

257257

258+
/*
259+
* strtoi --- just like strtol, but returns int not long
260+
*/
261+
static int
262+
strtoi(const char *nptr, char **endptr, int base)
263+
{
264+
long val;
265+
266+
val = strtol(nptr, endptr, base);
267+
#ifdef HAVE_LONG_INT_64
268+
if (val != (long) ((int32) val))
269+
errno = ERANGE;
270+
#endif
271+
return (int) val;
272+
}
273+
274+
258275
/*
259276
* Calendar time to Julian date conversions.
260277
* Julian date is commonly used in astronomical applications,
@@ -708,7 +725,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
708725
return DTERR_BAD_FORMAT;
709726

710727
errno = 0;
711-
val = strtol(field[i], &cp, 10);
728+
val = strtoi(field[i], &cp, 10);
712729
if (errno == ERANGE)
713730
return DTERR_FIELD_OVERFLOW;
714731

@@ -856,7 +873,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
856873
int val;
857874

858875
errno = 0;
859-
val = strtol(field[i], &cp, 10);
876+
val = strtoi(field[i], &cp, 10);
860877
if (errno == ERANGE)
861878
return DTERR_FIELD_OVERFLOW;
862879

@@ -1591,7 +1608,7 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
15911608
}
15921609

15931610
errno = 0;
1594-
val = strtol(field[i], &cp, 10);
1611+
val = strtoi(field[i], &cp, 10);
15951612
if (errno == ERANGE)
15961613
return DTERR_FIELD_OVERFLOW;
15971614

@@ -2214,14 +2231,14 @@ DecodeTime(char *str, int fmask, int *tmask, struct pg_tm * tm, fsec_t *fsec)
22142231
*tmask = DTK_TIME_M;
22152232

22162233
errno = 0;
2217-
tm->tm_hour = strtol(str, &cp, 10);
2234+
tm->tm_hour = strtoi(str, &cp, 10);
22182235
if (errno == ERANGE)
22192236
return DTERR_FIELD_OVERFLOW;
22202237
if (*cp != ':')
22212238
return DTERR_BAD_FORMAT;
22222239
str = cp + 1;
22232240
errno = 0;
2224-
tm->tm_min = strtol(str, &cp, 10);
2241+
tm->tm_min = strtoi(str, &cp, 10);
22252242
if (errno == ERANGE)
22262243
return DTERR_FIELD_OVERFLOW;
22272244
if (*cp == '\0')
@@ -2235,7 +2252,7 @@ DecodeTime(char *str, int fmask, int *tmask, struct pg_tm * tm, fsec_t *fsec)
22352252
{
22362253
str = cp + 1;
22372254
errno = 0;
2238-
tm->tm_sec = strtol(str, &cp, 10);
2255+
tm->tm_sec = strtoi(str, &cp, 10);
22392256
if (errno == ERANGE)
22402257
return DTERR_FIELD_OVERFLOW;
22412258
if (*cp == '\0')
@@ -2289,7 +2306,7 @@ DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask,
22892306
*tmask = 0;
22902307

22912308
errno = 0;
2292-
val = strtol(str, &cp, 10);
2309+
val = strtoi(str, &cp, 10);
22932310
if (errno == ERANGE)
22942311
return DTERR_FIELD_OVERFLOW;
22952312
if (cp == str)
@@ -2580,21 +2597,21 @@ DecodeTimezone(char *str, int *tzp)
25802597
return DTERR_BAD_FORMAT;
25812598

25822599
errno = 0;
2583-
hr = strtol(str + 1, &cp, 10);
2600+
hr = strtoi(str + 1, &cp, 10);
25842601
if (errno == ERANGE)
25852602
return DTERR_TZDISP_OVERFLOW;
25862603

25872604
/* explicit delimiter? */
25882605
if (*cp == ':')
25892606
{
25902607
errno = 0;
2591-
min = strtol(cp + 1, &cp, 10);
2608+
min = strtoi(cp + 1, &cp, 10);
25922609
if (errno == ERANGE)
25932610
return DTERR_TZDISP_OVERFLOW;
25942611
if (*cp == ':')
25952612
{
25962613
errno = 0;
2597-
sec = strtol(cp + 1, &cp, 10);
2614+
sec = strtoi(cp + 1, &cp, 10);
25982615
if (errno == ERANGE)
25992616
return DTERR_TZDISP_OVERFLOW;
26002617
}
@@ -2784,7 +2801,7 @@ DecodeInterval(char **field, int *ftype, int nf, int *dtype, struct pg_tm * tm,
27842801
case DTK_DATE:
27852802
case DTK_NUMBER:
27862803
errno = 0;
2787-
val = strtol(field[i], &cp, 10);
2804+
val = strtoi(field[i], &cp, 10);
27882805
if (errno == ERANGE)
27892806
return DTERR_FIELD_OVERFLOW;
27902807

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy