It used strlen() on the source, which might not be valid.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
char *ret;
/* We have to let through NULL for take(). */
- if (likely(p)) {
- len = strlen(p);
- if (len > n)
- len = n;
- } else
+ if (likely(p))
+ len = strnlen(p, n);
+ else
len = n;
ret = tal_dup_(ctx, p, 1, len, 1, false, TAL_LABEL(char, "[]"));
--- /dev/null
+#include <ccan/tal/str/str.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ccan/tal/str/str.c>
+#include <ccan/tap/tap.h>
+#include "helper.h"
+
+int main(int argc, char *argv[])
+{
+ char *str, *copy;
+
+ plan_tests(1);
+ str = malloc(5);
+ memcpy(str, "hello", 5);
+ /* We should be fine to strndup src without nul terminator. */
+ copy = tal_strndup(NULL, str, 5);
+ ok1(!strcmp(copy, "hello"));
+ tal_free(copy);
+ free(str);
+
+ return exit_status();
+}