@@ -1177,7 +1177,8 @@ parse_time(const char *value, time_t *result, bool utc_default)
11771177 char * 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;
11811182 len = 0 ;
11821183 fields_num = 1 ;
11831184
@@ -1205,21 +1206,30 @@ parse_time(const char *value, time_t *result, bool utc_default)
12051206 errno = 0 ;
12061207 hr = strtol (value + 1 , & cp , 10 );
12071208 if ((value + 1 ) == cp || errno == ERANGE )
1209+ {
1210+ pfree (tmp );
12081211 return false;
1212+ }
12091213
12101214 /* explicit delimiter? */
12111215 if (* cp == ':' )
12121216 {
12131217 errno = 0 ;
12141218 min = strtol (cp + 1 , & cp , 10 );
12151219 if (errno == ERANGE )
1220+ {
1221+ pfree (tmp );
12161222 return false;
1223+ }
12171224 if (* cp == ':' )
12181225 {
12191226 errno = 0 ;
12201227 sec = strtol (cp + 1 , & cp , 10 );
12211228 if (errno == ERANGE )
1229+ {
1230+ pfree (tmp );
12221231 return 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 */
12361246 if (hr < 0 || hr > MAX_TZDISP_HOUR )
1247+ {
1248+ pfree (tmp );
12371249 return false;
1250+ }
12381251 if (min < 0 || min >= MINS_PER_HOUR )
1252+ {
1253+ pfree (tmp );
12391254 return false;
1255+ }
12401256 if (sec < 0 || sec >= SECS_PER_MINUTE )
1257+ {
1258+ pfree (tmp );
12411259 return false;
1260+ }
12421261
12431262 tz = (hr * MINS_PER_HOUR + min ) * SECS_PER_MINUTE + sec ;
12441263 if (* value == '-' )
@@ -1251,7 +1270,10 @@ parse_time(const char *value, time_t *result, bool utc_default)
12511270 }
12521271 /* wrong format */
12531272 else if (!IsSpace (* value ))
1273+ {
1274+ pfree (tmp );
12541275 return false;
1276+ }
12551277 else
12561278 value ++ ;
12571279 }
@@ -1268,7 +1290,7 @@ parse_time(const char *value, time_t *result, bool utc_default)
12681290 i = 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
12731295 if (i < 3 || i > 6 )
12741296 return false;
0 commit comments