http-push: replace strcat with xsnprintf

We account for these strcats in our initial allocation, but
the code is confusing to follow and verify. Let's remember
our original allocation length, and then xsnprintf can
verify that we don't exceed it.

Note that we can't just use xstrfmt here (which would be
even cleaner) because the code tries to grow the buffer only
when necessary.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2015-09-24 17:06:58 -04:00 committed by Junio C Hamano
parent 48bcc1c3cc
commit 0cc4142859

View File

@ -786,21 +786,21 @@ xml_start_tag(void *userData, const char *name, const char **atts)
{ {
struct xml_ctx *ctx = (struct xml_ctx *)userData; struct xml_ctx *ctx = (struct xml_ctx *)userData;
const char *c = strchr(name, ':'); const char *c = strchr(name, ':');
int new_len; int old_namelen, new_len;
if (c == NULL) if (c == NULL)
c = name; c = name;
else else
c++; c++;
new_len = strlen(ctx->name) + strlen(c) + 2; old_namelen = strlen(ctx->name);
new_len = old_namelen + strlen(c) + 2;
if (new_len > ctx->len) { if (new_len > ctx->len) {
ctx->name = xrealloc(ctx->name, new_len); ctx->name = xrealloc(ctx->name, new_len);
ctx->len = new_len; ctx->len = new_len;
} }
strcat(ctx->name, "."); xsnprintf(ctx->name + old_namelen, ctx->len - old_namelen, ".%s", c);
strcat(ctx->name, c);
free(ctx->cdata); free(ctx->cdata);
ctx->cdata = NULL; ctx->cdata = NULL;