samedi 17 décembre, vers 11h, Sylvain Beucler déclara :

> On Sat, Dec 17, 2005 at 11:02:11AM +0100, Mathieu Roy wrote:
> > vendredi 16 décembre, vers 22h, Sylvain Beucler écrivit :
> > 
> > > I ran into a nasty issue yesterday at Savannah, while trying to
> > > recreate the users public keys.
> > > 
> > > I got overwhelmed with numerous sv_users processes. Here's what I
> > > think is the cause:
> > > 
> > > > From Groups.pm:
> > > my $pid = open (GPG, "|-");
> > > 
> > > if ($pid) {                   # parent
> > > print GPG $key;
> > > close (GPG);
> > > return $?;
> > > } else {                      # child
> > > exec (@gpg_args) || return 1;
> > > }
> > > 
> > > If exec fails, what happens? We have two processes, the father that
> > > will return after reading nothing on GPG, _and_ the son that will
> > > 'return 1' after failing to exec. Back in sv_users, they will both
> > > update the remaining keys. Repeat for at least 15 users and you get a
> > > fork bomb :/
> > > 
> > > (I'm not talking about security, just misconfiguration)
> > > 
> > > For reference, it may also be of interest that if two "children" try
> > > to access MySQL, you can get a "MySQL server has gone away" error.
> > > You should be able to reproduce the error by tweaking:
> > > 
> > > perl -MSavane -e 'print GetGroupName("101") . "\n"; open(FORK, "|-") || 
> > > sleep
> > >   1; print GetGroupName("102") . "\n";'
> > > 
> > > If you already got this kind of errors, that's a path
> > > to investigate.
> > > 
> > > About the issue, I suggest we change "return 1" into a die
> > > statement. If I'm right, this is an important point to keep in mind
> > > when programming :)
> > 
> > I think I grabbed part of this from the work done by someone else,
> > modifying it a bit, without taking time to really understand all it
> > involves. 
> > So far, I did not noticed problems. Indeed, since the bug seems to
> > reside in error handling, as I never experienced errors, I had no
> > issue.
> > 
> > Using die seems fine. I cannot explain why there was a return 1, maybe
> > it made sense from where I grabbed the code but not here.
> > 
> 
> I actually added this code during the Savannah merge one year ago.
> http://cvs.gna.org/cvsweb/savane.old-tree/lib/Savannah/Attic/User.pm.diff?r1=1.31.2.1;r2=1.31.2.2;cvsroot=savane;only_with_tag=DEV_2004-12-28_Savannah;f=h
> 
> It comes from [EMAIL PROTECTED] I'm not blaming anybody, just
> discussing a possible issue (and a possible fix).
> 
> Incidentally, I cannot find a way to retrieve that information from
> the SVN repository :'(
> 
> > I'm actually not quite sure that we want a die(). GPG stuff is extra
> > bonus. If it fails, we do not necessarily want the rest of sv_users to
> > fail.
> > If it fails, the error should probably be logged but sv_users should
> > probably continue, what do you think?
> 
> That's what I think, but the problem is a bit more complicated: when
> you are in the exec block, you already forked, and if you don't kill
> the fork when exec fails, then you get two concurrent 'sv_user'. Then
> those two sv_users can give birth to 4 'sv_user', etc.
> 
> If you kill the fork when exec fails, the father continues to live.

Ok, so we simply kill the fork :)



-- 
Mathieu Roy

  +---------------------------------------------------------------------+
  | General Homepage:           http://yeupou.coleumes.org/             |
  | Computing Homepage:         http://alberich.coleumes.org/           |
  | Not a native english speaker:                                       |
  |     http://stock.coleumes.org/doc.php?i=/misc-files/flawed-english  |
  +---------------------------------------------------------------------+

_______________________________________________
Savane-dev mailing list
Savane-dev@gna.org
https://mail.gna.org/listinfo/savane-dev

Reply via email to