+static bool adjust_size(size_t *size, size_t count)
+{
+ /* Multiplication wrap */
+ if (count && unlikely(*size * count / *size != count))
+ goto overflow;
+
+ *size *= count;
+
+ /* Make sure we don't wrap adding header. */
+ if (*size + sizeof(struct tal_hdr) < sizeof(struct tal_hdr))
+ goto overflow;
+ return true;
+overflow:
+ call_error("allocation size overflow");
+ return false;
+}
+
+void *tal_alloc_arr_(const tal_t *ctx, size_t size, size_t count, bool clear,
+ bool add_count, const char *label)
+{
+ void *ret;
+
+ if (!adjust_size(&size, count))
+ return NULL;
+
+ ret = tal_alloc_(ctx, size, clear, label);
+ if (likely(ret) && add_count) {
+ if (unlikely(!add_length_property(to_tal_hdr(ret), count)))
+ ret = tal_free(ret);
+ }
+ return ret;
+}
+