@@ -1101,7 +1101,7 @@ static void am_append_signoff(struct am_state *state)
{
struct strbuf sb = STRBUF_INIT;
- strbuf_attach(&sb, state->msg, state->msg_len, state->msg_len);
+ strbuf_attachstr_len(&sb, state->msg, state->msg_len);
append_signoff(&sb, 0, 0);
state->msg = strbuf_detach(&sb, &state->msg_len);
}
@@ -2946,7 +2946,7 @@ static void cat_blob(struct object_entry *oe, struct object_id *oid)
cat_blob_write("\n", 1);
if (oe && oe->pack_id == pack_id) {
last_blob.offset = oe->idx.offset;
- strbuf_attach(&last_blob.data, buf, size, size);
+ strbuf_attachstr_len(&last_blob.data, buf, size);
last_blob.depth = oe->depth;
} else
free(buf);
@@ -461,7 +461,7 @@ static int convert_to_utf8(struct mailinfo *mi,
return error("cannot convert from %s to %s",
charset, mi->metainfo_charset);
}
- strbuf_attach(line, out, out_len, out_len);
+ strbuf_attachstr_len(line, out, out_len);
return 0;
}
After the last few commits, we don't have many users of `strbuf_attach()`. Convert the sites in builtin/am.c, strbuf.c and mailinfo.c. They pass in the same length twice for `len` and `mem` and will eventually hit `realloc(3)`, which will be a no-op. The string in am.c has been constructed using the strbuf machinery in `read_commit_msg()`. In strbuf.c, we've used `reencode_string_iconv()`. In mailinfo.c, we used `reencode_string_len()`. So in all cases, we really do have an extra byte at the end with a NUL. As explained in the previous commit, it's not just that we avoid calling `realloc()` to make room for a single NUL byte that we already have, we avoid asking it for 16 more bytes and another 50% on top of that. Signed-off-by: Martin Ågren <martin.agren@gmail.com> --- builtin/am.c | 2 +- fast-import.c | 2 +- mailinfo.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)