On Mon, Jun 18, 2007 at 04:31:33PM +0200, Rados??aw Koz??owski wrote:
> I'm running mon r1.22 on RHEL 4 with perl 5.8.5 and the following line:
> 
>       my @log = map { s/\%//mg; } @_;
> 
> in
> 
>         no warnings; # Redefining syslog
>         sub syslog {
>            eval {
>                local $SIG{"__DIE__"}= sub { }; 
>                my @log = map { s/\%//mg; } @_;
>                Sys::Syslog::syslog(@log);
>            }
>         }
>         use warnings;
> 
> breaks logging to syslogd for me (ie. nothing is being logged). If I
> pass @_ to Sys::Syslog::syslog directly, everything works fine.
> 
> What's the idea behind this substitution, why is it needed?

I just realized, I didn't fully answer your question.

There are two things happening in Mon's local definition of syslog().

One, as I mentioned earlier, was wrapping it with an eval block so
if Sys::Syslog decided to call die() it wouldn't kill the Mon server.

The other is a workaround for a possible syslog vulnerability - syslog
has printf-like processing with % arguments, but Mon doesn't use
that feature.  If somehow Mon syslogged something with % signs in it,
you might see garbage in the log, or worse yet, a Perl error or crash.
There was a Perl advisory on this a year or two ago, so the
"my @log = map { s/\%//mg; } @_;" was added to delete any % signs that
may have ended up in strings intended for syslog.

If that map {} statement is giving you trouble, you could try replacing
these two lines:
>         my @log = map { s/\%//mg; } @_;
>         Sys::Syslog::syslog(@log);
with:

          Sys::Syslog::syslog($_[0], "%s", $_[1])

Which should work since as long as all the Mon syslog statements in the
current release use only two arguments (priority, string) to syslog()
(which I believe they do, but haven't the time to check at the moment).

_______________________________________________
mon mailing list
mon@linux.kernel.org
http://linux.kernel.org/mailman/listinfo/mon

Reply via email to