http://issues.apache.org/SpamAssassin/show_bug.cgi?id=5518
------- Additional Comments From [EMAIL PROTECTED] 2007-06-15 08:17 -------
Copied from bug 5510 comment 18
------- Additional Comment From Mark Martinec 2007-06-15 08:09 [reply] -------
(In reply to comment #13)
Assignments to $< and $> are fine with either 4294967294 or -2
[...] assignments to $( and $) that flake out if the number
is bigger than the maximum positive 32 bit signed int.
>
> this sounds like a perl bug on MacOS X
> However, POSIX::setgid() works fine to set both the real
> and effective gid with
> you'd probably have to do sth like this:
> - run the $) / $( assignments in an eval '...' block
> - capture errors
> - if error =~ /setrgid\(\) not implemented/, then
> - run POSIX::setgid(...)
> - die if that failed too
If POSIX::setgid and POSIX::setuid are available (and I can't think
why they wouldn't be), by all means, use ONLY these, to avoid
all the $<, $>, $( and $) perl crap, which is causing all kinds
of inconsistencies on various platforms. The Net::Server (which
is used by amavisd-new) had a series of problem-reports until
it finally switched to POSIX::setgid and POSIX::setuid.
For illustration (not that I claim it is best), this is what
currently stands in Net::Server::Daemonize.pm:
sub set_uid {
my $uid = get_uid( shift() );
POSIX::setuid($uid);
if ($< != $uid || $> != $uid) { # check $> also (rt #21262)
$< = $> = $uid; # try again-needed by some 5.8.0 linux systems (rt #13450)
if ($< != $uid) {
die "Couldn't become uid \"$uid\": $!\n";
}
}
return 1;
}
sub set_gid {
my $gids = get_gid( @_ );
my $gid = (split /\s+/, $gids)[0];
eval { $) = $gids }; # store all the gids - this is really sort of optional
POSIX::setgid($gid);
if (! grep {$gid == $_} split /\s+/, $() { # look for any valid id in list
die "Couldn't become gid \"$gid\": $!\n";
}
return 1;
}
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.