@@ -1177,7 +1177,8 @@ parse_time(const char *value, time_t *result, bool utc_default)
11771177char * local_tz = getenv ("TZ" );
11781178
11791179/* tmp = replace( value, !isalnum, ' ' ) */
1180- tmp = pgut_malloc (strlen (value )+ + 1 );
1180+ tmp = pgut_malloc (strlen (value )+ 1 );
1181+ if (!tmp )return false;
11811182len = 0 ;
11821183fields_num = 1 ;
11831184
@@ -1205,21 +1206,30 @@ parse_time(const char *value, time_t *result, bool utc_default)
12051206errno = 0 ;
12061207hr = strtol (value + 1 ,& cp ,10 );
12071208if ((value + 1 )== cp || errno == ERANGE )
1209+ {
1210+ pfree (tmp );
12081211return false;
1212+ }
12091213
12101214/* explicit delimiter? */
12111215if (* cp == ':' )
12121216{
12131217errno = 0 ;
12141218min = strtol (cp + 1 ,& cp ,10 );
12151219if (errno == ERANGE )
1220+ {
1221+ pfree (tmp );
12161222return false;
1223+ }
12171224if (* cp == ':' )
12181225{
12191226errno = 0 ;
12201227sec = strtol (cp + 1 ,& cp ,10 );
12211228if (errno == ERANGE )
1229+ {
1230+ pfree (tmp );
12221231return false;
1232+ }
12231233}
12241234}
12251235/* otherwise, might have run things together... */
@@ -1234,11 +1244,20 @@ parse_time(const char *value, time_t *result, bool utc_default)
12341244
12351245/* Range-check the values; see notes in datatype/timestamp.h */
12361246if (hr < 0 || hr > MAX_TZDISP_HOUR )
1247+ {
1248+ pfree (tmp );
12371249return false;
1250+ }
12381251if (min < 0 || min >=MINS_PER_HOUR )
1252+ {
1253+ pfree (tmp );
12391254return false;
1255+ }
12401256if (sec < 0 || sec >=SECS_PER_MINUTE )
1257+ {
1258+ pfree (tmp );
12411259return false;
1260+ }
12421261
12431262tz = (hr * MINS_PER_HOUR + min )* SECS_PER_MINUTE + sec ;
12441263if (* value == '-' )
@@ -1251,7 +1270,10 @@ parse_time(const char *value, time_t *result, bool utc_default)
12511270}
12521271/* wrong format */
12531272else if (!IsSpace (* value ))
1273+ {
1274+ pfree (tmp );
12541275return false;
1276+ }
12551277else
12561278value ++ ;
12571279}
@@ -1268,7 +1290,7 @@ parse_time(const char *value, time_t *result, bool utc_default)
12681290i = sscanf (tmp ,"%04d %02d %02d %02d %02d %02d%1s" ,
12691291& tm .tm_year ,& tm .tm_mon ,& tm .tm_mday ,
12701292& tm .tm_hour ,& tm .tm_min ,& tm .tm_sec ,junk );
1271- free (tmp );
1293+ pfree (tmp );
12721294
12731295if (i < 3 || i > 6 )
12741296return false;