There are several places in libFLAC like this:
     if(0 == (x = realloc(x, size)))
         return false;
and
     if(0 == (x = safe_realloc_mul_2op_(x, size1, size2))) {
         decoder_state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
         return false;
     }
If realloc fails, then the previous value of pointer x is lost and we have
memory leak. The simplest fix is to add new functions like this:
     static inline void *realloc_noleak_(void *ptr, size_t size)
     {
         void *tmp = realloc(ptr, size);
         if(!tmp)
             free(ptr); /* no memory leak */
         return tmp;
     }
     static inline void *safe_realloc_mul_2op_noleak_(void *ptr, size_t size1,
size_t size2)
     {
         if(!size1 || !size2)
             return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics
*/
         if(size1 > SIZE_MAX / size2)
             return 0;
         return realloc_noleak_(ptr, size1*size2);
     }
And use them in such places. Or maybe some better solution exists?