The following reply was made to PR mod_rewrite/3874; it has been noted by GNATS.
From: "Ralf S. Engelschall" <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Cc: Subject: Re: mod_rewrite/3874: RewriteLock doesn't work for virtual hosts
and silently fails
Date: Wed, 10 Mar 1999 13:54:57 +0100
In article <[EMAIL PROTECTED]> you wrote:
>[...]
> The lock file is opened during the init_child() phase and the file pointer is
> saved in that server_rec, but that config info isn't propagated to the
> virtual
> host config. Since the file pointer isn't available, even though locking is
> turned on, no locking is done and no warning is given and things break.
>>How-To-Repeat:
> Add a logging line to rewritelock_alloc() like
>
> if (conf->rewritelockfp != -1) {
> fd_lock(r, conf->rewritelockfp);
> } else if (conf->rewritelockfile) {
> ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ALERT, r,
> "mod_rewrite: Don't have lockfile descriptor, can't
> lock");
> }
>
> then use RewriteLock and RewriteMap inside and outside of a virtual host
> and you'll see that the lockfile fp isn't available through the virtual
> host config, so no locking is done.
>>Fix:
> I moved the
> rewritelock_open(s, p);
> call from the init_child() function to the server for loop in
> init_module() where the rewritelog open is as well, and that seems
> to have fixed it.
You're right that there might be a problem caused by the fact that the
filedescriptor isn't merged into virtual host. But your solution (moving the
rewritelock_open call to the init_module function) is incorrect, because this
doesn't work on platforms where flock() is used. Because under flock() based
locking the file _has_ to be opened by the child. So the only solution seems
to be to interate in init_child() over the virtual hosts. I'll look at
this...
Ralf S. Engelschall
[EMAIL PROTECTED]
www.engelschall.com