@@ -1177,7 +1177,8 @@ parse_time(const char *value, time_t *result, bool utc_default)
1177
1177
char * local_tz = getenv ("TZ" );
1178
1178
1179
1179
/* tmp = replace( value, !isalnum, ' ' ) */
1180
- tmp = pgut_malloc (strlen (value ) + + 1 );
1180
+ tmp = pgut_malloc (strlen (value ) + 1 );
1181
+ if (!tmp ) return false;
1181
1182
len = 0 ;
1182
1183
fields_num = 1 ;
1183
1184
@@ -1205,21 +1206,30 @@ parse_time(const char *value, time_t *result, bool utc_default)
1205
1206
errno = 0 ;
1206
1207
hr = strtol (value + 1 , & cp , 10 );
1207
1208
if ((value + 1 ) == cp || errno == ERANGE )
1209
+ {
1210
+ pfree (tmp );
1208
1211
return false;
1212
+ }
1209
1213
1210
1214
/* explicit delimiter? */
1211
1215
if (* cp == ':' )
1212
1216
{
1213
1217
errno = 0 ;
1214
1218
min = strtol (cp + 1 , & cp , 10 );
1215
1219
if (errno == ERANGE )
1220
+ {
1221
+ pfree (tmp );
1216
1222
return false;
1223
+ }
1217
1224
if (* cp == ':' )
1218
1225
{
1219
1226
errno = 0 ;
1220
1227
sec = strtol (cp + 1 , & cp , 10 );
1221
1228
if (errno == ERANGE )
1229
+ {
1230
+ pfree (tmp );
1222
1231
return false;
1232
+ }
1223
1233
}
1224
1234
}
1225
1235
/* otherwise, might have run things together... */
@@ -1234,11 +1244,20 @@ parse_time(const char *value, time_t *result, bool utc_default)
1234
1244
1235
1245
/* Range-check the values; see notes in datatype/timestamp.h */
1236
1246
if (hr < 0 || hr > MAX_TZDISP_HOUR )
1247
+ {
1248
+ pfree (tmp );
1237
1249
return false;
1250
+ }
1238
1251
if (min < 0 || min >= MINS_PER_HOUR )
1252
+ {
1253
+ pfree (tmp );
1239
1254
return false;
1255
+ }
1240
1256
if (sec < 0 || sec >= SECS_PER_MINUTE )
1257
+ {
1258
+ pfree (tmp );
1241
1259
return false;
1260
+ }
1242
1261
1243
1262
tz = (hr * MINS_PER_HOUR + min ) * SECS_PER_MINUTE + sec ;
1244
1263
if (* value == '-' )
@@ -1251,7 +1270,10 @@ parse_time(const char *value, time_t *result, bool utc_default)
1251
1270
}
1252
1271
/* wrong format */
1253
1272
else if (!IsSpace (* value ))
1273
+ {
1274
+ pfree (tmp );
1254
1275
return false;
1276
+ }
1255
1277
else
1256
1278
value ++ ;
1257
1279
}
@@ -1268,7 +1290,7 @@ parse_time(const char *value, time_t *result, bool utc_default)
1268
1290
i = sscanf (tmp , "%04d %02d %02d %02d %02d %02d%1s" ,
1269
1291
& tm .tm_year , & tm .tm_mon , & tm .tm_mday ,
1270
1292
& tm .tm_hour , & tm .tm_min , & tm .tm_sec , junk );
1271
- free (tmp );
1293
+ pfree (tmp );
1272
1294
1273
1295
if (i < 3 || i > 6 )
1274
1296
return false;
0 commit comments