ngx_pfree() вызывать не нужно, так как он умеет освобождать только
большие куски памяти. По окончании запроса вся память, выделенная из
r->pool,
освобождается. А ngx_pfree() используется, например, в gzip-фильтре
по окончании сжатия для освобождения буферов, выделенных для zlib.
Это около 100-300К, и их можно освободить, чтобы не занимать эту память
во время передачи ответа клиенту.
А memory leak скорее всего в generate_top_banner() - там нужно
всю память выделять через ngx_palloc(r->pool, ...).