sorry, I still own it. I've just been disconnected from the world a long time. it will take me a while to get back to you on this but I will
> From: Tony Wildish <[email protected]> > Date: Thu, 7 May 2009 10:58:12 +0200 > To: <[email protected]> > Subject: Re: Bug in PoCo::Child when PID wraps round (fwd) > > Hi, > > just checking one more time: is anyone looking after PoCo::Child, or is > it orphaned? > > TIA, > Tony. > > On Wed, 15 Apr 2009, Tony Wildish wrote: > >> Hi, >> >> I sent this to the [email protected] list some time ago >> but it looks like that list is dead. Is there someone here managing >> PoCo::Child? >> >> Cheers, >> Tony. >> >> ---------- Forwarded message ---------- >> Date: Tue, 24 Mar 2009 12:56:33 +0100 (CET) >> From: Tony Wildish <[email protected]> >> To: [email protected] >> Subject: Bug in PoCo::Child when PID wraps round >> >> Hi, >> >> we have been using PoCo::Child in a project for a while now and have just >> uncovered a bug. The internal bookkeeping for the association of wheelIDs >> and PIDs is wrong, with the result that when the OS PID wraps round, the >> wrong wheelID will be given to the 'done' event. >> >> I'm using PoCo::Child version 1.39, perl 5.8.5, kernel >> 2.6.9-78.0.8.EL.cernsmp. >> >> You can see the bug by inspection of the code. At line 192 we have: >> >> my $id = $wheel->ID; >> $self->debug(qq/run(): "@$cmd", wheel=$id, pid=/ . $wheel->PID); >> >> $self->{$PKG}{pids}{$wheel->PID} = $id; >> >> so the {pids} are inserted keyed on $wheel->PID. But at line 268, the >> clean up deletes as follows: >> >> delete $self->{$PKG}{wheels}{$id}; >> delete $self->{$PKG}{pids}{$id}; >> >> so it's deleting keyed on wheel->ID, not $wheel->PID. >> >> When the PIDs wrap round, the protection in sig_child is broken by this: >> >> sub sig_child { >> my ($kernel, $self, $pid, $rc) = @_[KERNEL, OBJECT, ARG1, ARG2]; >> >> my $id = $self->{$PKG}{pids}{$pid} || ""; >> >> # child death signals are issued by the OS and sent to all >> # sessions; we want to handle only our own children >> >> return unless $id; >> >> Because the {pids} hash had the wrong entry deleted in the cleanup, when >> the PIDs wrap, an old $id will be found where none should be. So sig_child >> will not return here, and will cause 'done' to be fired with the old >> wheelID, which is plainly wrong. >> >> Also, the cleanup around line 268/269 should remove {CLOSED} and >> {SIGCHLD} entries for the wheel too. That's less serious because it won't >> cause a problem until wheel-IDs wrap round, which will take a lot longer, >> but it's still a leak. >> >> Cheers, >> Tony. >>
