Bug 1014868 - SyslogHandler fails to log messages which contain NUL bytes
Summary: SyslogHandler fails to log messages which contain NUL bytes
Keywords:
Status: CLOSED CURRENTRELEASE
Alias: None
Product: Beaker
Classification: Retired
Component: scheduler
Version: 0.15
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: 0.15.1
Assignee: Dan Callaghan
QA Contact: Raymond Mancy
URL:
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2013-10-03 00:32 UTC by Dan Callaghan
Modified: 2018-02-06 00:41 UTC (History)
8 users (show)

Fixed In Version:
Clone Of:
Environment:
Last Closed: 2013-10-23 06:59:19 UTC
Embargoed:


Attachments (Terms of Use)

Description Dan Callaghan 2013-10-03 00:32:31 UTC
Kid does some hackery to inject template filenames into stack traces (or doesn't do hackery to inject them properly, whatever) when an exception happens during template processing. Normally the stack trace looks like this:

[...]
  File "/usr/lib/python2.6/site-packages/kid/filter.py", line 26, in apply_matches
    for ev, item in stream:
  File "/usr/lib/python2.6/site-packages/kid/parser.py", line 179, in _track
    for p in stream:
  File "/usr/lib/python2.6/site-packages/kid/parser.py", line 221, in _coalesce
    for ev, item in stream:
  File "/home/dcallagh/work/beaker/Server/bkr/server/templates/system_notes.py", line 141, in _pull
  File "/usr/lib/python2.6/site-packages/kid/parser.py", line 179, in _track
    for p in stream:
  File "/usr/lib/python2.6/site-packages/kid/parser.py", line 130, in strip
    for ev, item in self._iter:
  File "/usr/lib/python2.6/site-packages/kid/parser.py", line 179, in _track
    for p in stream:
[...]

Note the source line is missing for the template file (system_notes.kid), so presumably some attribute somewhere in the traceback is None instead of a real value.

When an exception like this happens in Beaker running in Apache, logging to syslog, the following appears in the Apache error log:

[Thu Oct 03 00:19:44 2013] [error] /usr/lib/python2.6/site-packages/kid/codewriter.py:91: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
[Thu Oct 03 00:19:44 2013] [error]   setattr(self, arg, getattr(error, arg))
[Thu Oct 03 00:19:44 2013] [error] Traceback (most recent call last):
[Thu Oct 03 00:19:44 2013] [error]   File "/usr/lib/python2.6/site-packages/bkr/log.py", line 50, in emit
[Thu Oct 03 00:19:44 2013] [error]     syslog.syslog(priority, line)
[Thu Oct 03 00:19:44 2013] [error] TypeError: [priority,] message string

I'm guessing "line" in this case is None which is a TypeError. Not sure where the BaseException.message warning is coming from.

Comment 1 Dan Callaghan 2013-10-03 00:44:13 UTC
On second thought, the problem might actually be caused by < > characters in the stack trace. See bug 1014870 for a traceback that triggers it.

Comment 3 Dan Callaghan 2013-10-03 07:07:09 UTC
It turns out the exception is actually caused by the line having NUL bytes, which is not allowed by the syslog(3) library call (nor by the syslog protocol I imagine).

Here is the repr of the line which it's trying to log, from the stack trace caused by bug 1014870:

' \xff\xfe<\x00x\x00m\x00l\x00>\x00<\x00p\x00>\x00a\x00s\x00d\x00f\x00 \x00<\x00l\x00o\x00l\x00>\x00<\x00/\x00p\x00>\x00<\x00/\x00x\x00m\x00l\x00>\x00'

which looks like UTF-16 as bytes with a prepended space character. How Kid ever produced that is completely beyond me. But nevertheless, SyslogHandler should deal with NUL bytes gracefully (replace them with '?' or '\x00' or '').

Comment 4 Dan Callaghan 2013-10-03 07:11:50 UTC
(In reply to Dan Callaghan from comment #3)
> which looks like UTF-16 as bytes with a prepended space character. How Kid
> ever produced that is completely beyond me.

Oh, of course, the prepended space is actually from SyslogHandler due to the multi-line message. So Kid is really just spitting out UTF-16 as bytes, which is not such a surprising bug I suppose.

Comment 5 Dan Callaghan 2013-10-03 07:12:59 UTC
On Gerrit: http://gerrit.beaker-project.org/2329

Comment 7 wangjing 2013-10-08 08:56:59 UTC
hi, Dan,

1. I'v seen the error logs in comment0, but what's ur expected results?

2. due to bug 1014870 might be the cause of this bug, and it has been verified now, so the problem of this bug may not be reproduced again, right?

Comment 8 Dan Callaghan 2013-10-08 22:13:39 UTC
(In reply to wangjing from comment #7)
> 1. I'v seen the error logs in comment0, but what's ur expected results?

Expected result is no TypeError on stderr (/var/log/httpd/error_log) and a complete stack trace in /var/log/beaker/server-debug.log (previously the line full of \x00 junk was missing):

[...]
Oct  8 09:55:27 beaker beaker-server[328]:    File "/usr/lib/python2.6/site-packages/kid/parser.py", line 221, in _coalesce
Oct  8 09:55:27 beaker beaker-server[328]:      for ev, item in stream:
Oct  8 09:55:27 beaker beaker-server[328]:    File "/usr/lib/python2.6/site-packages/kid/parser.py", line 393, in __iter__
Oct  8 09:55:27 beaker beaker-server[328]:      for ev, stuff in self._expat_stream():
Oct  8 09:55:27 beaker beaker-server[328]:    File "/usr/lib/python2.6/site-packages/kid/parser.py", line 372, in _expat_stream
Oct  8 09:55:27 beaker beaker-server[328]:      feed(data)
Oct  8 09:55:27 beaker beaker-server[328]:    File "/usr/lib/python2.6/site-packages/kid/parser.py", line 434, in feed
Oct  8 09:55:27 beaker beaker-server[328]:      raise expat.ExpatError(e)
Oct  8 09:55:27 beaker beaker-server[328]:  ExpatError: Error parsing XML:
Oct  8 09:55:27 beaker beaker-server[328]:  <FF><FE><\x00x\x00m\x00l\x00>\x00<\x00p\x00>\x00a\x00s\x00d\x00f\x00 \x00<\x00l\x00o\x00l\x00>\x00<\x00/\x00p\x00>\x00<\x00/\x00x\x00m\x00l\x00>\x00
Oct  8 09:55:27 beaker beaker-server[328]:                       ^
Oct  8 09:55:27 beaker beaker-server[328]:  mismatched tag: line 1, column 21
Oct  8 09:55:27 beaker beaker-server[328]:  Error in code generated from template file 'build/lib/bkr/server/templates/system.kid'

> 2. due to bug 1014870 might be the cause of this bug, and it has been
> verified now, so the problem of this bug may not be reproduced again, right?

Right, there is no way to reproduce this naturally now that bug 1014870 is fixed. I think the only way to verify it would be to manually inject some code like raise Exception('\xff\xfe<\x00') somewhere.

I will ask one of the other Beaker developers to verify this bug in their environment.

Comment 9 Raymond Mancy 2013-10-08 23:27:41 UTC
I have verified this on my local install of Beaker.

Steps to verify were:
Inserting the following into my_paginate_grid.kid pre patch:
  <?python
  raise Exception('\xff\xfe<\x00')
  ?>

This gave the TypeError mentioned previously when accessing Beaker's main page.

I then upgraded to the patched version of Beaker, re-added the exception in the template, restarted apache and the TypeError was no longer present. Also, it now prints the literal zero byte string in server-debug.log:


  Exception: ��<\x00

Unfortunately there is no good way to recover the unicode char, but as expected we are printing the zero byte in this case.

Comment 11 Raymond Mancy 2013-10-23 06:59:19 UTC
beaker 0.15.1 has been released.


Note You need to log in before you can comment on or make changes to this bug.