44
45
#define HELPER_MAX_ARGS 64
46
/* size of helper read buffer (maximum?). no reason given for this size */
47
/* though it has been seen to be too short for some requests */
48
/* it is dynamic, so increasng should not have side effects */
48
/** Initial Squid input buffer size. Helper responses may exceed this, and
49
* Squid will grow the input buffer as needed, up to ReadBufMaxSize.
51
const size_t ReadBufMinSize(4*1024);
53
/** Maximum safe size of a helper-to-Squid response message plus one.
54
* Squid will warn and close the stream if a helper sends a too-big response.
55
* ssl_crtd helper is known to produce responses of at least 10KB in size.
56
* Some undocumented helpers are known to produce responses exceeding 8KB.
58
const size_t ReadBufMaxSize(32*1024);
51
60
static IOCB helperHandleRead;
52
61
static IOCB helperStatefulHandleRead;
150
159
srv->addr = hlp->addr;
153
srv->rbuf = (char *)memAllocBuf(BUF_8KB, &srv->rbuf_sz);
162
srv->rbuf = (char *)memAllocBuf(ReadBufMinSize, &srv->rbuf_sz);
154
163
srv->wqueue = new MemBuf;
155
164
srv->roffset = 0;
156
165
srv->requests = (helper_request **)xcalloc(hlp->concurrency ? hlp->concurrency : 1, sizeof(*srv->requests));
948
957
helperReturnBuffer(i, srv, hlp, msg, t);
952
comm_read(fd, srv->rbuf + srv->roffset, srv->rbuf_sz - srv->roffset - 1, helperHandleRead, srv);
960
if (srv->rfd != -1) {
961
int spaceSize = srv->rbuf_sz - srv->roffset - 1;
962
assert(spaceSize >= 0);
964
// grow the input buffer if needed and possible
965
if (!spaceSize && srv->rbuf_sz + 4096 <= ReadBufMaxSize) {
966
srv->rbuf = (char *)memReallocBuf(srv->rbuf, srv->rbuf_sz + 4096, &srv->rbuf_sz);
967
debugs(84, 3, HERE << "Grew read buffer to " << srv->rbuf_sz);
968
spaceSize = srv->rbuf_sz - srv->roffset - 1;
969
assert(spaceSize >= 0);
972
// quit reading if there is no space left
974
debugs(84, DBG_IMPORTANT, "ERROR: Disconnecting from a " <<
975
"helper that overflowed " << srv->rbuf_sz << "-byte " <<
976
"Squid input buffer: " << hlp->id_name << " #" <<
983
srv->flags.closing=1;
988
if (WaitForSingleObject(srv->hIpc, 5000) != WAIT_OBJECT_0) {
990
debugs(84, 1, "helperShutdown: WARNING: " << hlp->id_name <<
991
" #" << no << " (" << hlp->cmdline->key << "," <<
992
(long int)srv->pid << ") didn't exit in 5 seconds");
994
CloseHandle(srv->hIpc);
1000
comm_read(fd, srv->rbuf + srv->roffset, spaceSize, helperHandleRead, srv);
1025
1074
helperStatefulReleaseServer(srv);
1029
comm_read(srv->rfd, srv->rbuf + srv->roffset, srv->rbuf_sz - srv->roffset - 1,
1030
helperStatefulHandleRead, srv);
1077
if (srv->rfd != -1) {
1078
int spaceSize = srv->rbuf_sz - srv->roffset - 1;
1079
assert(spaceSize >= 0);
1081
// grow the input buffer if needed and possible
1082
if (!spaceSize && srv->rbuf_sz + 4096 <= ReadBufMaxSize) {
1083
srv->rbuf = (char *)memReallocBuf(srv->rbuf, srv->rbuf_sz + 4096, &srv->rbuf_sz);
1084
debugs(84, 3, HERE << "Grew read buffer to " << srv->rbuf_sz);
1085
spaceSize = srv->rbuf_sz - srv->roffset - 1;
1086
assert(spaceSize >= 0);
1089
// quit reading if there is no space left
1091
debugs(84, DBG_IMPORTANT, "ERROR: Disconnecting from a " <<
1092
"helper that overflowed " << srv->rbuf_sz << "-byte " <<
1093
"Squid input buffer: " << hlp->id_name << " #" <<
1097
if (srv->rfd == wfd)
1099
srv->flags.closing=1;
1104
if (WaitForSingleObject(srv->hIpc, 5000) != WAIT_OBJECT_0) {
1106
debugs(84, 1, "helperShutdown: WARNING: " << hlp->id_name <<
1107
" #" << no << " (" << hlp->cmdline->key << "," <<
1108
(long int)srv->pid << ") didn't exit in 5 seconds");
1110
CloseHandle(srv->hIpc);
1116
comm_read(srv->rfd, srv->rbuf + srv->roffset, spaceSize, helperStatefulHandleRead, srv);