Skip to content

Commit dd2b4c1

Browse files
authored
Merge pull request #6 from lobaro/fix/improve-h-parse
Improve 'H' parsing
2 parents 7386e9b + 9812cd5 commit dd2b4c1

File tree

1 file changed

+57
-55
lines changed

1 file changed

+57
-55
lines changed

ccronexpr.c

+57-55
Original file line numberDiff line numberDiff line change
@@ -1277,68 +1277,70 @@ static char *replace_h_entry(char *field, unsigned int pos, unsigned int min, co
12771277

12781278
static char *check_and_replace_h(char *field, unsigned int pos, unsigned int min, const char **error) {
12791279
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);
12921303
}
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;
13051306
}
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";
13101322
goto return_error;
13111323
}
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;
13281331
}
1329-
free_splitted(subfields, subfields_len);
1330-
cronFree(field);
1331-
return accum_field;
13321332
}
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;
13411336
}
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);
13421344
return field;
13431345
}
13441346

0 commit comments

Comments
 (0)