Re: [squid-users] External C program

From: Amos Jeffries <squid3_at_treenet.co.nz>
Date: Wed, 29 Apr 2009 20:22:11 +1200

Julien Philibin wrote:
> Hi John,
> thanks for your reply.
>
> I'll give a shot with your skeleton and see how things are going on ...
>
> On Tue, Apr 28, 2009 at 1:59 AM, John Doe <jdmls_at_yahoo.com> wrote:
>> From: Julien Philibin <julien_at_philibin.fr>
>>> Hi, I've been trying to find a typical external ACL C program skeleton
>>> for a while, but I wasn't able to find anything very interesting ...
>>> What I would like to do, is to read to different strings and process
>>> them in order to allow/disallow access to a website.
>>> The thing is, after a while I get two processes that use around 10 Mb
>>> of memory and 15% of my CPU ....
>>> Also, if I restart squid, I'll get two more processes running and so
>>> on, everytime I restart squid ...
>> Personaly, I use fgets/fflush and I did not see any problem (memory leak, etc) so far...
>> Something like:
>>
>> #define INPUTSIZE 4096

FYI: I've just had to start bumping my own custom helpers to using 8196
or more for their buffers. Current Squid allow up to 8196 for URL length
and many more for possible headers length so watch that on inputs.

>> char input[INPUTSIZE];
>> while (fgets(input, sizeof(input), stdin)) {
>> if ((cp=strchr(input, '\n')) == NULL) {
>> fprintf(stderr, "filter: input too big: %s\n", input);
>> } else {
>> *cp = '\0';
>> }
>> ...
>> fflush(stderr);
>> fflush(stdout);
>> }
>>
>> Do you use any malloc or functions that malloc... and that would need a free?
>
> Yes I do, but I also free them (the memory usage doesn't change). I
> also made a mistake, it is not 10Mb but 1 ...
>
>
> THe only weird thing is that after a restart (of squid), it looks like
> squid doesn't have any control anymore on the externals programs and
> they (both of external programs) start to use a lot of CPU...
>
> Maybe it has something to do with stdin that was not flushed correctly
> and creates an infinite loop or something ...

Probably. Squid simply closes its connection to the pipes and abandons
the old helper. Leaving the pipe close with a '\0' I believe.
  From the docs of scanf() I don't get a clear idea of the return value
when empty string is received (is it 1/0/EOF?).

Also scanf() you were using earlier has no concept of length and opens
the possibility of buffer over-runs.

Prefer fgets or snscanf() as input methods.

Amos

-- 
Please be using
   Current Stable Squid 2.7.STABLE6 or 3.0.STABLE14
   Current Beta Squid 3.1.0.7
Received on Wed Apr 29 2009 - 08:22:56 MDT

This archive was generated by hypermail 2.2.0 : Thu Apr 30 2009 - 12:00:03 MDT