mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 14:35:26 +00:00
Fix an off-by-one error in cfg_print_duration()
The cfg_print_duration() checks added previously in the 'duration_test' unit test uncovered a bug in cfg_print_duration(). When calculating the current 'str' pointer of the generated text in the buffer 'buf', it erroneously adds 1 byte to compensate for that part's indicator character. For example, to add 12 minutes, it needs to add 2 + 1 = 3 characters, where 2 is the length of "12", and 1 is the length of "M" (for minute). The mistake was that the length of the indicator is already included in 'durationlen[i]', so there is no need to calculate it again. In the result of this mistake the current pointer can advance further than needed and end up after the zero-byte instead of right on it, which essentially cuts off any further generated text. For example, for a 5 minutes and 30 seconds duration, instead of having this: 'P', 'T', '5', 'M', '3', '0', 'S', '\0' The function generates this: 'P', 'T', '5', 'M', '\0', '3', '0', 'S', '\0' Fix the bug by adding to 'str' just 'durationlen[i]' instead of 'durationlen[i] + 1'.
This commit is contained in:
@@ -1096,7 +1096,7 @@ cfg_print_duration(cfg_printer_t *pctx, const cfg_obj_t *obj) {
|
||||
if (duration.parts[i] > 0) {
|
||||
snprintf(str, durationlen[i] + 2, "%u%c",
|
||||
(uint32_t)duration.parts[i], indicators[i]);
|
||||
str += durationlen[i] + 1;
|
||||
str += durationlen[i];
|
||||
}
|
||||
if (i == 3 && T) {
|
||||
snprintf(str, 2, "T");
|
||||
|
Reference in New Issue
Block a user