@@ -1277,68 +1277,70 @@ static char *replace_h_entry(char *field, unsigned int pos, unsigned int min, co
1277
1277
1278
1278
static char * check_and_replace_h (char * field , unsigned int pos , unsigned int min , const char * * error ) {
1279
1279
char * has_h = strchr (field , 'H' );
1280
- if (has_h ) {
1281
- char * accum_field = NULL ;
1282
- char * * subfields = NULL ;
1283
- size_t subfields_len = 0 ;
1284
- // Check if Field contains ',', if so, split into multiple subfields, and replace in each (with same position no)
1285
- char * has_comma = strchr (field , ',' );
1286
- if (has_comma ) {
1287
- // Iterate over split sub-fields, check for 'H' and replace if present
1288
- subfields = split_str (field , ',' , & subfields_len );
1289
- if (subfields == NULL ) {
1290
- * error = "Failed to split 'H' string in list" ;
1291
- goto return_error ;
1280
+
1281
+ if (!has_h ) {
1282
+ return field ;
1283
+ }
1284
+
1285
+ char * accum_field = NULL ;
1286
+ char * * subfields = NULL ;
1287
+ size_t subfields_len = 0 ;
1288
+ // Check if Field contains ',', if so, split into multiple subfields, and replace in each (with same position no)
1289
+ char * has_comma = strchr (field , ',' );
1290
+ if (has_comma ) {
1291
+ // Iterate over split sub-fields, check for 'H' and replace if present
1292
+ subfields = split_str (field , ',' , & subfields_len );
1293
+ if (subfields == NULL ) {
1294
+ * error = "Failed to split 'H' string in list" ;
1295
+ goto return_error ;
1296
+ }
1297
+ size_t res_len = 0 ;
1298
+ size_t res_lens [subfields_len ];
1299
+ for (size_t i = 0 ; i < subfields_len ; i ++ ) {
1300
+ has_h = strchr (subfields [i ], 'H' );
1301
+ if (has_h ) {
1302
+ subfields [i ] = replace_h_entry (subfields [i ], pos , min , error );
1292
1303
}
1293
- size_t res_len = 0 ;
1294
- size_t res_lens [subfields_len ];
1295
- for (size_t i = 0 ; i < subfields_len ; i ++ ) {
1296
- has_h = strchr (subfields [i ], 'H' );
1297
- if (has_h ) {
1298
- subfields [i ] = replace_h_entry (subfields [i ], pos , min , error );
1299
- }
1300
- if (* error != NULL ) {
1301
- goto return_error ;
1302
- }
1303
- res_lens [i ] = strnlen (subfields [i ], CRON_MAX_STR_LEN_TO_SPLIT );
1304
- res_len += res_lens [i ];
1304
+ if (* error != NULL ) {
1305
+ goto return_error ;
1305
1306
}
1306
- // Allocate space for the full string: Result lengths + (result count - 1) for the commas + 1 for '\0'
1307
- accum_field = (char * ) cronMalloc (res_len + subfields_len );
1308
- if (accum_field == NULL ) {
1309
- * error = "Failed to merge 'H' in list" ;
1307
+ res_lens [i ] = strnlen (subfields [i ], CRON_MAX_STR_LEN_TO_SPLIT );
1308
+ res_len += res_lens [i ];
1309
+ }
1310
+ // Allocate space for the full string: Result lengths + (result count - 1) for the commas + 1 for '\0'
1311
+ accum_field = (char * ) cronMalloc (res_len + subfields_len );
1312
+ if (accum_field == NULL ) {
1313
+ * error = "Failed to merge 'H' in list" ;
1314
+ goto return_error ;
1315
+ }
1316
+ memset (accum_field , 0 , res_len + subfields_len );
1317
+ char * tracking = accum_field ;
1318
+ for (size_t i = 0 ; i < subfields_len ; i ++ ) {
1319
+ // Sanity check: Is "tracking" still in the allocated memory boundaries?
1320
+ if ((tracking - accum_field ) > (res_len + subfields_len )) {
1321
+ * error = "Failed to insert subfields to merged fields: String went oob" ;
1310
1322
goto return_error ;
1311
1323
}
1312
- memset (accum_field , 0 , res_len + subfields_len );
1313
- char * tracking = accum_field ;
1314
- for (size_t i = 0 ; i < subfields_len ; i ++ ) {
1315
- // Sanity check: Is "tracking" still in the allocated memory boundaries?
1316
- if ((tracking - accum_field ) > (res_len + subfields_len )) {
1317
- * error = "Failed to insert subfields to merged fields: String went oob" ;
1318
- goto return_error ;
1319
- }
1320
- strncpy (tracking , subfields [i ], res_lens [i ]);
1321
- tracking += res_lens [i ];
1322
- // Don't append comma to last list entry
1323
- if (i < subfields_len - 1 ) {
1324
- strncpy (tracking , "," ,
1325
- 2 ); // using 2 to ensure the string ends in '\0', tracking will be set to that char
1326
- tracking += 1 ;
1327
- }
1324
+ strncpy (tracking , subfields [i ], res_lens [i ]);
1325
+ tracking += res_lens [i ];
1326
+ // Don't append comma to last list entry
1327
+ if (i < subfields_len - 1 ) {
1328
+ strncpy (tracking , "," ,
1329
+ 2 ); // using 2 to ensure the string ends in '\0', tracking will be set to that char
1330
+ tracking += 1 ;
1328
1331
}
1329
- free_splitted (subfields , subfields_len );
1330
- cronFree (field );
1331
- return accum_field ;
1332
1332
}
1333
- // only one H to find and replace, then return
1334
- field = replace_h_entry (field , pos , min , error );
1335
- return field ;
1336
-
1337
- return_error :
1338
- if (subfields ) free_splitted (subfields , subfields_len );
1339
- if (accum_field ) cronFree (accum_field );
1340
- return field ;
1333
+ free_splitted (subfields , subfields_len );
1334
+ cronFree (field );
1335
+ return accum_field ;
1341
1336
}
1337
+ // only one H to find and replace, then return
1338
+ field = replace_h_entry (field , pos , min , error );
1339
+ return field ;
1340
+
1341
+ return_error :
1342
+ if (subfields ) free_splitted (subfields , subfields_len );
1343
+ if (accum_field ) cronFree (accum_field );
1342
1344
return field ;
1343
1345
}
1344
1346
0 commit comments