mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	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.
This commit is contained in:
		@@ -8,7 +8,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * IDENTIFICATION
 | 
			
		||||
 *	  $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.160.2.5 2008/02/25 23:21:22 tgl Exp $
 | 
			
		||||
 *	  $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.160.2.6 2008/06/09 19:34:24 tgl Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *-------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
@@ -585,6 +585,23 @@ static datetkn *datecache[MAXDATEFIELDS] = {NULL};
 | 
			
		||||
static datetkn *deltacache[MAXDATEFIELDS] = {NULL};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * strtoi --- just like strtol, but returns int not long
 | 
			
		||||
 */
 | 
			
		||||
static int
 | 
			
		||||
strtoi(const char *nptr, char **endptr, int base)
 | 
			
		||||
{
 | 
			
		||||
	long	val;
 | 
			
		||||
 | 
			
		||||
	val = strtol(nptr, endptr, base);
 | 
			
		||||
#ifdef HAVE_LONG_INT_64
 | 
			
		||||
	if (val != (long) ((int32) val))
 | 
			
		||||
		errno = ERANGE;
 | 
			
		||||
#endif
 | 
			
		||||
	return (int) val;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Calendar time to Julian date conversions.
 | 
			
		||||
 * Julian date is commonly used in astronomical applications,
 | 
			
		||||
@@ -1017,7 +1034,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
 | 
			
		||||
						return DTERR_BAD_FORMAT;
 | 
			
		||||
 | 
			
		||||
					errno = 0;
 | 
			
		||||
					val = strtol(field[i], &cp, 10);
 | 
			
		||||
					val = strtoi(field[i], &cp, 10);
 | 
			
		||||
					if (errno == ERANGE)
 | 
			
		||||
						return DTERR_FIELD_OVERFLOW;
 | 
			
		||||
 | 
			
		||||
@@ -1166,7 +1183,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
 | 
			
		||||
					int			val;
 | 
			
		||||
 | 
			
		||||
					errno = 0;
 | 
			
		||||
					val = strtol(field[i], &cp, 10);
 | 
			
		||||
					val = strtoi(field[i], &cp, 10);
 | 
			
		||||
					if (errno == ERANGE)
 | 
			
		||||
						return DTERR_FIELD_OVERFLOW;
 | 
			
		||||
 | 
			
		||||
@@ -1885,7 +1902,7 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					errno = 0;
 | 
			
		||||
					val = strtol(field[i], &cp, 10);
 | 
			
		||||
					val = strtoi(field[i], &cp, 10);
 | 
			
		||||
					if (errno == ERANGE)
 | 
			
		||||
						return DTERR_FIELD_OVERFLOW;
 | 
			
		||||
 | 
			
		||||
@@ -2462,14 +2479,14 @@ DecodeTime(char *str, int fmask, int *tmask, struct pg_tm * tm, fsec_t *fsec)
 | 
			
		||||
	*tmask = DTK_TIME_M;
 | 
			
		||||
 | 
			
		||||
	errno = 0;
 | 
			
		||||
	tm->tm_hour = strtol(str, &cp, 10);
 | 
			
		||||
	tm->tm_hour = strtoi(str, &cp, 10);
 | 
			
		||||
	if (errno == ERANGE)
 | 
			
		||||
		return DTERR_FIELD_OVERFLOW;
 | 
			
		||||
	if (*cp != ':')
 | 
			
		||||
		return DTERR_BAD_FORMAT;
 | 
			
		||||
	str = cp + 1;
 | 
			
		||||
	errno = 0;
 | 
			
		||||
	tm->tm_min = strtol(str, &cp, 10);
 | 
			
		||||
	tm->tm_min = strtoi(str, &cp, 10);
 | 
			
		||||
	if (errno == ERANGE)
 | 
			
		||||
		return DTERR_FIELD_OVERFLOW;
 | 
			
		||||
	if (*cp == '\0')
 | 
			
		||||
@@ -2483,7 +2500,7 @@ DecodeTime(char *str, int fmask, int *tmask, struct pg_tm * tm, fsec_t *fsec)
 | 
			
		||||
	{
 | 
			
		||||
		str = cp + 1;
 | 
			
		||||
		errno = 0;
 | 
			
		||||
		tm->tm_sec = strtol(str, &cp, 10);
 | 
			
		||||
		tm->tm_sec = strtoi(str, &cp, 10);
 | 
			
		||||
		if (errno == ERANGE)
 | 
			
		||||
			return DTERR_FIELD_OVERFLOW;
 | 
			
		||||
		if (*cp == '\0')
 | 
			
		||||
@@ -2537,7 +2554,7 @@ DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask,
 | 
			
		||||
	*tmask = 0;
 | 
			
		||||
 | 
			
		||||
	errno = 0;
 | 
			
		||||
	val = strtol(str, &cp, 10);
 | 
			
		||||
	val = strtoi(str, &cp, 10);
 | 
			
		||||
	if (errno == ERANGE)
 | 
			
		||||
		return DTERR_FIELD_OVERFLOW;
 | 
			
		||||
	if (cp == str)
 | 
			
		||||
@@ -2827,7 +2844,7 @@ DecodeTimezone(char *str, int *tzp)
 | 
			
		||||
		return DTERR_BAD_FORMAT;
 | 
			
		||||
 | 
			
		||||
	errno = 0;
 | 
			
		||||
	hr = strtol(str + 1, &cp, 10);
 | 
			
		||||
	hr = strtoi(str + 1, &cp, 10);
 | 
			
		||||
	if (errno == ERANGE)
 | 
			
		||||
		return DTERR_TZDISP_OVERFLOW;
 | 
			
		||||
 | 
			
		||||
@@ -2835,7 +2852,7 @@ DecodeTimezone(char *str, int *tzp)
 | 
			
		||||
	if (*cp == ':')
 | 
			
		||||
	{
 | 
			
		||||
		errno = 0;
 | 
			
		||||
		min = strtol(cp + 1, &cp, 10);
 | 
			
		||||
		min = strtoi(cp + 1, &cp, 10);
 | 
			
		||||
		if (errno == ERANGE)
 | 
			
		||||
			return DTERR_TZDISP_OVERFLOW;
 | 
			
		||||
	}
 | 
			
		||||
@@ -3082,7 +3099,7 @@ DecodeInterval(char **field, int *ftype, int nf, int *dtype, struct pg_tm * tm,
 | 
			
		||||
			case DTK_DATE:
 | 
			
		||||
			case DTK_NUMBER:
 | 
			
		||||
				errno = 0;
 | 
			
		||||
				val = strtol(field[i], &cp, 10);
 | 
			
		||||
				val = strtoi(field[i], &cp, 10);
 | 
			
		||||
				if (errno == ERANGE)
 | 
			
		||||
					return DTERR_FIELD_OVERFLOW;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user