Skip to content

Commit

Permalink
Make logic clearer in talloc_buffer_append_buffer
Browse files Browse the repository at this point in the history
... and \0 terminate the output string, oops
  • Loading branch information
arr2036 committed Jan 25, 2018
1 parent 9ccddf6 commit 4849e20
Showing 1 changed file with 13 additions and 9 deletions.
22 changes: 13 additions & 9 deletions src/lib/util/talloc.c
Expand Up @@ -215,15 +215,15 @@ char *talloc_buffer_append_variadic_buffer(char *to, int argc, ...)
va_list ap_val, ap_len;
int i;

size_t to_len, from_len = 0, total_len;
size_t to_len, total_len = 0;
char *out, *p;

if (!to) return NULL;

va_start(ap_val, argc);
va_copy(ap_len, ap_val);

to_len = talloc_array_length(to);
total_len += to_len = talloc_array_length(to) - 1;

/*
* Figure out how much we need to realloc
Expand All @@ -234,19 +234,22 @@ char *talloc_buffer_append_variadic_buffer(char *to, int argc, ...)
arg = va_arg(ap_len, char *);
if (!arg) continue;

from_len += (talloc_array_length(arg) - 1);
total_len += (talloc_array_length(arg) - 1);
}
total_len = to_len + from_len;

/*
* It's a noop...
*/
if (total_len == to_len) {
va_end(ap_val);
va_end(ap_len);
return to;
}

out = talloc_realloc(talloc_parent(to), to, char, total_len);
out = talloc_realloc(talloc_parent(to), to, char, total_len + 1);
if (!out) goto finish;

p = out + (to_len - 1);
p = out + to_len;

/*
* Copy the args in
Expand All @@ -258,11 +261,12 @@ char *talloc_buffer_append_variadic_buffer(char *to, int argc, ...)
arg = va_arg(ap_val, char *);
if (!arg) continue;

len = talloc_array_length(arg);
len = talloc_array_length(arg) - 1;

memcpy(p, arg, len - 1);
p += (len - 1);
memcpy(p, arg, len);
p += len;
}
*p = '\0';

finish:
va_end(ap_val);
Expand Down

0 comments on commit 4849e20

Please sign in to comment.