X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftal%2Ftal.c;h=dce9d233a076733f636f42fbc2e02f0956cd364a;hp=0b5e8e445674720f288819c9d2370e1a80d14c64;hb=bb480e553f9d204b85a2e42de0be42c7b80eebda;hpb=e03d7ecb505cb73ff244708323b0f1a5a0c5cd7a;ds=sidebyside diff --git a/ccan/tal/tal.c b/ccan/tal/tal.c index 0b5e8e44..dce9d233 100644 --- a/ccan/tal/tal.c +++ b/ccan/tal/tal.c @@ -718,18 +718,26 @@ bool tal_resize_(tal_t **ctxp, size_t size) char *tal_strdup(const tal_t *ctx, const char *p) { - return tal_dup(ctx, char, p, strlen(p)+1, 0); + /* We have to let through NULL for take(). */ + return tal_dup(ctx, char, p, p ? strlen(p) + 1: 1, 0); } char *tal_strndup(const tal_t *ctx, const char *p, size_t n) { + size_t len; char *ret; - if (strlen(p) < n) - n = strlen(p); - ret = tal_dup(ctx, char, p, n, 1); + /* We have to let through NULL for take(). */ + if (likely(p)) { + len = strlen(p); + if (len > n) + len = n; + } else + len = n; + + ret = tal_dup(ctx, char, p, len, 1); if (ret) - ret[n] = '\0'; + ret[len] = '\0'; return ret; } @@ -779,10 +787,15 @@ 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; + size_t max; char *buf; int ret; + if (!fmt && taken(fmt)) + return NULL; + + /* A decent guess to start. */ + max = strlen(fmt) * 2; buf = tal_arr(ctx, char, max); while (buf) { va_list ap2;