On Wed, 16 Aug 2023 19:12:25 -0400 Steven Rostedt <rostedt@xxxxxxxxxxx> wrote: > > > + > > > + for (i = 0; i < size; i++) { > > > + old[i] = copy[i]; > > > + > > > + if (copy_traceeval_data(types + i, stats + i, > > > + vals + i, copy + i)) > > > + goto fail; > > > + } > > > > I think we still need to rip through old[] and free strings, and also call > > Yes, I forgot to add that :-p > > > .release on types that define it, probably via data_release(). > > I realized I actually had this kind of backwards. On failure, we want to put back old and remove the data added to vals (aka copy). Here's what I'm doing: for (i = 0; i < size; i++) { old[i] = copy[i]; if (copy_traceeval_data(types + i, stats + i, vals + i, copy + i)) goto fail; } data_release(size, old, types); return 0; fail: /* Free the new values that were added */ data_release(i, copy, types); /* Put back the old values */ for (i--; i >= 0; i--) { copy_traceeval_data(types + i, NULL, copy + i, old + i); } return -1; -- Steve