+
+ /* Now try overflow cases for tal_dup. */
+ error_count = 0;
+ pi = origpi = tal_arr(NULL, int, 100);
+ ok1(pi);
+ ok1(error_count == 0);
+ pi = tal_dup(NULL, int, pi, (size_t)-1, 0);
+ ok1(!pi);
+ ok1(error_count == 1);
+ pi = tal_dup(NULL, int, pi, 0, (size_t)-1);
+ ok1(!pi);
+ ok1(error_count == 2);
+
+ pi = tal_dup(NULL, int, pi, (size_t)-1UL / sizeof(int),
+ (size_t)-1UL / sizeof(int));
+ ok1(!pi);
+ ok1(error_count == 3);
+ /* This will still overflow when tal_hdr is added. */
+ pi = tal_dup(NULL, int, pi, (size_t)-1UL / sizeof(int) / 2,
+ (size_t)-1UL / sizeof(int) / 2);
+ ok1(!pi);
+ ok1(error_count == 4);
+
+ /* Now, check that with TAL_TAKE we free old one on failure. */
+ pi = tal_arr(NULL, int, 100);
+ error_count = 0;
+ pi = tal_dup(TAL_TAKE, int, pi, (size_t)-1, 0);
+ ok1(!pi);
+ ok1(error_count == 1);
+ ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
+
+ pi = tal_arr(NULL, int, 100);
+ error_count = 0;
+ pi = tal_dup(TAL_TAKE, int, pi, 0, (size_t)-1);
+ ok1(!pi);
+ ok1(error_count == 1);
+ ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
+
+ pi = tal_arr(NULL, int, 100);
+ error_count = 0;
+ pi = tal_dup(TAL_TAKE, int, pi, (size_t)-1UL / sizeof(int),
+ (size_t)-1UL / sizeof(int));
+ ok1(!pi);
+ ok1(error_count == 1);
+ ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
+
+ pi = tal_arr(NULL, int, 100);
+ error_count = 0;
+ /* This will still overflow when tal_hdr is added. */
+ pi = tal_dup(TAL_TAKE, int, pi, (size_t)-1UL / sizeof(int) / 2,
+ (size_t)-1UL / sizeof(int) / 2);
+ ok1(!pi);
+ ok1(error_count == 1);
+ ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
+