Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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

+29-12
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)