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 :)

-- 
Sylvain

Reply via email to