# HG changeset patch # User Olaf Wintermann # Date 1670145621 -3600 # Node ID edbbb3000494d7d8b3d7eb6226bd9cd86b0bb063 # Parent d7b276de183bf407be4275c44df727dfbc82df82 fix cgi stderr logger + reuse stderr tmp buffer diff -r d7b276de183b -r edbbb3000494 src/server/safs/cgi.c --- a/src/server/safs/cgi.c Sun Dec 04 09:09:55 2022 +0100 +++ b/src/server/safs/cgi.c Sun Dec 04 10:20:21 2022 +0100 @@ -372,13 +372,14 @@ char buf[4096]; char *line = buf; - int line_start = 0; + int line_start; ssize_t r; while((r = read(handler->process.err[0], buf, 4096)) > 0) { + line_start = 0; int pos = 0; // log stderr output lines for(int i=0;istderr_tmp) { - pool_free(pool, handler->stderr_tmp); - handler->stderr_tmp = NULL; handler->stderr_tmplen = 0; } } @@ -402,18 +401,44 @@ // check for incomplete line if(pos < r) { int tmplen = r-pos; - if(handler->stderr_tmp) { - handler->stderr_tmp = pool_realloc(pool, handler->stderr_tmp, handler->stderr_tmplen + tmplen); + if(handler->stderr_tmplen > 0) { + // append new text to the temp buffer + if(handler->stderr_tmplen + tmplen > handler->stderr_tmpalloc) { + handler->stderr_tmpalloc = handler->stderr_tmplen + tmplen; + handler->stderr_tmp = pool_realloc(pool, handler->stderr_tmp, handler->stderr_tmpalloc); + if(!handler->stderr_tmp) { + log_ereport(LOG_FAILURE, "send-cgi: cannot create tmp buffer for parsing stderr"); + handler->stderr_tmpalloc = 0; + handler->stderr_tmplen = 0; + continue; + } + } memcpy(handler->stderr_tmp + handler->stderr_tmplen, line + line_start, tmplen); handler->stderr_tmplen += tmplen; } else { - handler->stderr_tmp = pool_malloc(pool, tmplen); + if(handler->stderr_tmpalloc < tmplen) { + // tmp buffer too small or not allocated + handler->stderr_tmpalloc = tmplen < 256 ? 256 : tmplen; + if(handler->stderr_tmp) { + // free old tmp buf + // pool_realloc doesn't make sense here, because it + // is just free+malloc+memcpy and we don't need the + // memcpy part, because we are just reusing the buffer + // and the previous content doesn't matter + pool_free(pool, handler->stderr_tmp); + } + handler->stderr_tmp = pool_malloc(pool, handler->stderr_tmpalloc); + if(!handler->stderr_tmp) { + log_ereport(LOG_FAILURE, "send-cgi: cannot create tmp buffer for parsing stderr"); + handler->stderr_tmpalloc = 0; + handler->stderr_tmplen = 0; + continue; + } + } memcpy(handler->stderr_tmp, line + line_start, tmplen); handler->stderr_tmplen = tmplen; } } else { - pool_free(pool, handler->stderr_tmp); - handler->stderr_tmp = NULL; handler->stderr_tmplen = 0; } } diff -r d7b276de183b -r edbbb3000494 src/server/safs/cgi.h --- a/src/server/safs/cgi.h Sun Dec 04 09:09:55 2022 +0100 +++ b/src/server/safs/cgi.h Sun Dec 04 10:20:21 2022 +0100 @@ -62,6 +62,7 @@ Event *stderrev; char *stderr_tmp; int stderr_tmplen; + int stderr_tmpalloc; char *writebuf; size_t writebuf_alloc; size_t writebuf_size;