Пример в архиве с исходниками libpng.
Открываем contrib/gregbook/readpng.c. Обращаем внимание вот на что:
1) Функция readpng_get_image ставит setjmp в котором уничтожает png_ptr и info_ptr и возращает NULL в случае прихода туда по longjmp. Это случится если в какой-нибудь png-шной функции произойдёт ошибка.
2) Затем выделяется память image_data = (…)malloc(…) и row_pointers = (…)malloc(…).
3) А вот далее вызывается png_read_image(…), и если в ней произойдёт ошибка, то из неё будет тот самый longjmp, при этом image_data и row_pointers не будут удалены!
Правда image_data потом удаляется в readpng_cleanup (если её вызовут), а вот row_pointers так и останется не удалённым.
Я нигде не ошибся?