The start and stop ranges are inclusive.
This means that the size is (stop - start) + 1.
The problems happens where the code is adding additional digits to represent end of line or other special characters.
When this is added, I seem to have forgotten to add the additional numbers to the + 1 and instead replaced the + 1.
This results in the size being potentially short by a single character and thus an invalid write is possible.
}
// Ensure that there is room for the potential terminating newline.
- status = f_string_dynamic_increase_by((range->stop - range->start) + 1, destination);
+ status = f_string_dynamic_increase_by((range->stop - range->start) + 2, destination);
if (F_status_is_error(status)) return status;
const f_array_length_t destination_used = destination->used;
}
// Ensure that there is room for a slash delimit, the object open character, and the end of line character.
- status = f_string_dynamic_increase_by((range->stop - range->start) + 3, destination);
+ status = f_string_dynamic_increase_by((range->stop - range->start) + 4, destination);
if (F_status_is_error(status)) return status;
const f_array_length_t used_start = destination->used;
}
// Ensure that there is room for a slash delimit and possibly the end of content character.
- status = f_string_dynamic_increase_by((range->stop - range->start) + 2, destination);
+ status = f_string_dynamic_increase_by((range->stop - range->start) + 3, destination);
if (F_status_is_error(status)) return status;
const f_array_length_t used_start = destination->used;
}
// Ensure that there is room for a slash delimit, the object open character, and the end of line character.
- status = f_string_dynamic_increase_by((range->stop - range->start) + 3, destination);
+ status = f_string_dynamic_increase_by((range->stop - range->start) + 4, destination);
if (F_status_is_error(status)) return status;
const f_array_length_t used_start = destination->used;
}
// Ensure that there is room for a slash delimit and possibly the end of content characters.
- status = f_string_dynamic_increase_by((range->stop - range->start) + 3, destination);
+ status = f_string_dynamic_increase_by((range->stop - range->start) + 4, destination);
if (F_status_is_error(status)) return status;
const f_array_length_t used_start = destination->used;
}
// Ensure that there is room for a slash delimit, the object open character, and the end of line character.
- status = f_string_dynamic_increase_by((range->stop - range->start) + 3, destination);
+ status = f_string_dynamic_increase_by((range->stop - range->start) + 4, destination);
if (F_status_is_error(status)) return status;
const f_array_length_t used_start = destination->used;
}
// Ensure that there is room for a slash delimit and possibly the end of content characters.
- status = f_string_dynamic_increase_by((range->stop - range->start) + 3, destination);
+ status = f_string_dynamic_increase_by((range->stop - range->start) + 4, destination);
if (F_status_is_error(status)) return status;
const f_array_length_t used_start = destination->used;
}
// Ensure that there is room for the potential start and stop quotes, a potential delimit at start, and the potential object open character.
- status = f_string_dynamic_increase_by((range->stop - range->start) + 4, destination);
+ status = f_string_dynamic_increase_by((range->stop - range->start) + 5, destination);
if (F_status_is_error(status)) return status;
const f_array_length_t input_start = range->start;