tal: take implies NULL passthrough.
[ccan] / ccan / tal / tal.c
index 0b5e8e445674720f288819c9d2370e1a80d14c64..dce9d233a076733f636f42fbc2e02f0956cd364a 100644 (file)
@@ -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;