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?