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:
parent
48bcc1c3cc
commit
0cc4142859
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user