X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftake%2Ftake.c;h=73e5c29d206fcf5a5cf23e7b6f8d4836a3d06fc4;hb=HEAD;hp=c628aac0dc97ff663db216e4f05a14b8cfd38bbf;hpb=cbabfa8c8bd4757091c7fdb566b97388be890a74;p=ccan diff --git a/ccan/take/take.c b/ccan/take/take.c index c628aac0..4833bf93 100644 --- a/ccan/take/take.c +++ b/ccan/take/take.c @@ -32,9 +32,20 @@ void *take_(const void *p, const char *label) } takenarr = new; /* Once labelarr is set, we maintain it. */ - if (labelarr) - labelarr = realloc(labelarr, - sizeof(*labelarr) * (max_taken+1)); + if (labelarr) { + const char **labelarr_new; + labelarr_new = realloc(labelarr, + sizeof(*labelarr) * (max_taken+1)); + if (labelarr_new) { + labelarr = labelarr_new; + } else { + /* num_taken will be out of sync with the size of + * labelarr after realloc failure. + * Just pretend that we never had labelarr allocated. */ + free(labelarr); + labelarr = NULL; + } + } max_taken++; } if (unlikely(labelarr))