[Cluster-devel] [PATCHv2 dlm-tool 2/2] dlm_controld: fix rare off by one
Alexander Aring
aahringo at redhat.com
Thu Oct 6 12:45:11 UTC 2022
Hi,
On Wed, Oct 5, 2022 at 3:23 PM Alexander Aring <aahringo at redhat.com> wrote:
>
> While debugging I came across a rare off by one when the snprintf()
> filled string _exactly_ matched the size (with '\0') and we return the
> bytes written without \0. We will then write a "\n\0" pattern at the
> end but when the string exactly matched there is missing byte in the
> calculation of the "\n\0" pattern because the return value only reduced
> the size by one. To fix that we substract -1 from the return value of
> snprintf() to have at the end two bytes for the "\n\0" pattern. If we
> would hit the case that the buffer exactly matched we truncate the
> string by one byte because we need to fit '\n' and '\0' into the buffer.
> ---
> v2:
> - remove sob.
> - only really do the truncate of one byte when the buffer would exact
> match which is the given size and the returned size + 1 ('\0').
>
> dlm_controld/logging.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/dlm_controld/logging.c b/dlm_controld/logging.c
> index 2c57138c..bfd7d274 100644
> --- a/dlm_controld/logging.c
> +++ b/dlm_controld/logging.c
> @@ -181,10 +181,14 @@ void log_level(char *name_in, uint32_t level_in, const char *fmt, ...)
> ret = vsnprintf(log_str + pos, len - pos, fmt, ap);
> va_end(ap);
>
> - if (ret >= len - pos)
> + if (ret >= len - pos) {
> pos = len - 1;
> - else
> - pos += ret;
> + } else {
> + if (ret + 1 == len - pos)
> + pos += ret - 1;
I will drop this patch, this case is being handled in the parent if
branch and sets len-1 which truncates the string...
- Alex
More information about the Cluster-devel
mailing list