X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftal%2Ftal.c;h=d7b7b4b22e6ad34ad54e21f6b8bd2683d97c4337;hp=e575130568ca26913ad97ed00fa2feb6f4cf7740;hb=5bdda8409e559d1b3485639ed43d3b69e4c3fa62;hpb=0e34459a02e2615f50bac2767c7dce6632470946 diff --git a/ccan/tal/tal.c b/ccan/tal/tal.c index e5751305..d7b7b4b2 100644 --- a/ccan/tal/tal.c +++ b/ccan/tal/tal.c @@ -706,7 +706,12 @@ char *tal_strndup(const tal_t *ctx, const char *p, size_t n) void *tal_memdup(const tal_t *ctx, const void *p, size_t n) { - void *ret = tal_arr(ctx, char, n); + void *ret; + + if (ctx == TAL_TAKE) + return (void *)p; + + ret = tal_arr(ctx, char, n); if (ret) memcpy(ret, p, n); return ret; @@ -727,9 +732,14 @@ char *tal_asprintf(const tal_t *ctx, const char *fmt, ...) char *tal_vasprintf(const tal_t *ctx, const char *fmt, va_list ap) { size_t max = strlen(fmt) * 2; - char *buf = tal_arr(ctx, char, max); + char *buf; int ret; + if (ctx == TAL_TAKE) + buf = tal_arr(tal_parent(fmt), char, max); + else + buf = tal_arr(ctx, char, max); + while (buf) { va_list ap2; @@ -741,6 +751,8 @@ char *tal_vasprintf(const tal_t *ctx, const char *fmt, va_list ap) break; buf = tal_resize(buf, max *= 2); } + if (ctx == TAL_TAKE) + tal_free(fmt); return buf; }