[fpc-devel] Lazarus Apache module crashes during concurrent requests

ABorka fpc-devel at aborka.com
Tue Sep 23 23:09:49 CEST 2008


Hi Michael,

Unfortunately, I do not have any C compilers - nor the knowledge to 
compile something with the apache header files in C.
I manually compared the .h/.inc and the translated pascal 
structures/records for the two you have mentioned (module_struct and 
request_rec) and they seem to have the same fields, nothing added to 
them so far till Apache 2.2.9 .
For me in Windows XP 32bit/ FPC:
sizeof(request_rec)=416
sizeof(module_struct)=56

Not sure if it is a full list but in the apr header files (ap_mmn.h) 
there's a change list:
.
.snip I believe the translation happened for 2.2.3 so those are included
.
+* 20051115.4 (2.2.4)  Added ap_get_server_banner() and
  *                         ap_get_server_description() (minor)
  * 20051115.5 (2.2.5)  Added ap_mpm_safe_kill() (minor)
  * 20051115.6 (2.2.7)  Added retry_set to proxy_worker (minor)
+* 20051115.7 (2.2.7)  Added conn_rec::clogging_input_filters (minor)
  * 20051115.8 (2.2.7)  Added flags to proxy_alias (minor)
+* 20051115.9 (2.2.7)  Add ap_send_interim_response API
  * 20051115.10(2.2.7)  Added ap_mod_status_reqtail (minor)
  * 20051115.11(2.2.7)  Add *ftp_directory_charset to proxy_dir_conf
  * 20051115.12(2.2.8)  Add optional function ap_logio_add_bytes_in() to 
mog_logio
  * 20051115.13(2.2.9)  Add disablereuse and disablereuse_set
  *                     to proxy_worker struct (minor)
  * 20051115.14(2.2.9)  Add ap_proxy_ssl_connection_cleanup and
  *                     add *scpool, *r and need_flush to proxy_conn_rec
  *                     structure
  * 20051115.15(2.2.9)  Add interpolate_env to proxy_dir_conf and
  *                     introduce proxy_req_conf.

The ones marked with '+' I added to my httpd.inc and httpd_protocol.inc 
files. The rest were for apache mods (mod_proxy, etc.) so ignored them.
The crash did not go away. At least on Windows, Apache loads the module 
and executes it sometimes. On Linux the apache modules compiled don't 
even load.

AB


Michael Van Canneyt wrote:
> 
> On Mon, 22 Sep 2008, ABorka wrote:
> 
>> After some more debugging the result is even stranger:
>>
>> If I reduce the code to the bare minimum there is still a crash most of the
>> time.
>>
>> 1. works always for 2 concurrent requests:
>> procedure TCustomApacheApplication.HandleRequest(ARequest: TRequest;
>> AResponse: TResponse);
>> Var
>>   MC : TCustomHTTPModuleClass;
>>   M  : TCustomHTTPModule;
>>   MN : String;
>>   MI : TModuleItem;
>> i:Integer;
>>
>> begin
>>       MI:=ModuleFactory[0];
>>       MC:=MI.ModuleClass;
>>       M:=MC.Create(Self);
>>       M.Name := '';
>> aresponse.content := '<html>Hello</html>';
>>       for i := 0 to Maxint do;//time wasting loop, about 5 secs
>> end;
>>
>> 2. crashes randomly:
>> begin
>>       MI:=ModuleFactory[0];
>>       MC:=MI.ModuleClass;
>>       M:=MC.Create(Self);
>>       M.Name := '';
>> M.HandleRequest(ARequest,AResponse);
>>       for i := 0 to Maxint do;//time wasting loop, about 5 secs
>> end;//<= sometimes crash after here but before returning to caller function
>>
>> 3. always crashes:
>> begin
>>   try
>>       MI:=ModuleFactory[0];
>>       MC:=MI.ModuleClass;
>>       M:=MC.Create(Self);
>>       M.Name := '';
>> aresponse.content := '<html>Hello</html>';
>>       for i := 0 to Maxint do;//time wasting loop, about 5 secs
>>   except
>>     On E : Exception do
>>       ShowRequestException(AResponse,E);
>>   end;
>> end;//<= guaranteed crash after here but before returning to caller function
>>
>>
>> When M.HandleRequest(ARequest,AResponse); is used instead of aresponse.content
>> := '<html>Hello</html>'; the crash is random at procedure return for the 2nd
>> simultaneous caller.
>>
>> When the procedure contains any try/except it is guaranteed not returning
>> (crashing) after the work is finished for the 2nd caller (2nd simultaneaous
>> request).
>>
>> The first simultaneous caller always works without a problem.
>>
>> Any suggestions?
> 
> Yes: please print the size of the Request_rec (or TRequest_Rec) and the
> same record in C. Compare if they are equal. Same for the module record.
> If they are not equal, then we know it is a problem with the pascal 
> definition of this record. I've had to do this exercise about 30 times 
> myself on various platforms to get it right. Maybe they changed the 
> size again.
> 
> Michael.
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel
> 




More information about the fpc-devel mailing list