Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3a4e929

Browse files
committed
Fix datetime input functions to correctly detect integer overflow when
running on a 64-bit platform ... strtol() will happily return 64-bitoutput in that case. Per bug #4231 from Geoff Tolley.
1 parent5862cda commit3a4e929

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
staticconstdatetkn*deltacache[MAXDATEFIELDS]= {NULL};
256256

257257

258+
/*
259+
* strtoi --- just like strtol, but returns int not long
260+
*/
261+
staticint
262+
strtoi(constchar*nptr,char**endptr,intbase)
263+
{
264+
longval;
265+
266+
val=strtol(nptr,endptr,base);
267+
#ifdefHAVE_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
returnDTERR_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
returnDTERR_FIELD_OVERFLOW;
714731

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

858875
errno=0;
859-
val=strtol(field[i],&cp,10);
876+
val=strtoi(field[i],&cp,10);
860877
if (errno==ERANGE)
861878
returnDTERR_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
returnDTERR_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
returnDTERR_FIELD_OVERFLOW;
22202237
if (*cp!=':')
22212238
returnDTERR_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
returnDTERR_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
returnDTERR_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
returnDTERR_FIELD_OVERFLOW;
22952312
if (cp==str)
@@ -2580,21 +2597,21 @@ DecodeTimezone(char *str, int *tzp)
25802597
returnDTERR_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
returnDTERR_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
returnDTERR_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
returnDTERR_TZDISP_OVERFLOW;
26002617
}
@@ -2784,7 +2801,7 @@ DecodeInterval(char **field, int *ftype, int nf, int *dtype, struct pg_tm * tm,
27842801
caseDTK_DATE:
27852802
caseDTK_NUMBER:
27862803
errno=0;
2787-
val=strtol(field[i],&cp,10);
2804+
val=strtoi(field[i],&cp,10);
27882805
if (errno==ERANGE)
27892806
returnDTERR_FIELD_OVERFLOW;
27902807

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp