I’ve checked the glib source too (in version 2.50, but I do not think it changed too much between the two version) and have no idea how this could happen.
So, an example line is definitively needed to find the root cause.
On the other hand, there is a trick in that code to save a malloc and a “static”[*] buffer is used in that code. Therefore if that buffer is reallocated (and therefore the “static” buffer is freed, that means that the memory gets to be corrupted.
[*] Practically the buffer is allocated from the stack, but it’s working just like a static buffer from the malloc point of view. It should not be freed.
From: syslog-ng [mailto:syslog-ng-bounces@lists.balabit.hu] On Behalf Of James Elstone
Sent: Friday, January 06, 2017 2:55 PM
To: Syslog-ng users' and developers' mailing list
Subject: Re: [syslog-ng] Hitting g_assert when using sanitize-utf8 enabled!
Sorry; update - It happens on the first packet that contains \x092 when sanitize-utf8 is enabled; consistently.
Running glib 2.46.2 with Syslog-ng 3.7.3 on FreeBSD 10.3.
Any ideas please?
Kr,
James
JamesOn 6 January 2017 13:38:58 GMT+00:00, James Elstone <james@elstone.net> wrote:
Hi Bazsi,
The version of glib is 2.46.2 on FreeBSD 10.3.
The issue does not occur on the first packet coming through, but when under light load (~100/sec)...
Tried reducing the number of unprintable chars and now only \0x92 exists in the inbound message it falls over on. It is always a message with \0x92 that causes it to fail.
Is there a way to have a filter applies before the message is utf8_sanitised using a regular expression or the like?
What if the assert was removed, what effect would it have?
Many thanks to all!
Kr,
JamesOn 6 January 2017 12:49:28 GMT+00:00, "Scheidler, Balázs" <balazs.scheidler@balabit.com> wrote:
Hi,
Attila is right, it would help a lot to see the original log message and your glib version. That code path uses a performance hack that relies on a GLib implementation detail. Either the glib behaviour has changed or another assumption fails, but just looking at the code I don't know what might.
--
Bazsi
On Fri, Jan 6, 2017 at 1:41 PM, Szalai, Attila <Attila.Szalai@morganstanley.com> wrote:
Hi James,
Checking the source, it means the following:
The code allocate a buffer 6 times bigger than the original string length to able to hold the escaped form of the utf-8 character.
The assert means, that the string, after escaping was not fit into this buffer for some reason. Or, to be more precise, the GString implementation decided that it should reallocate the string, which usually only happen if the string gets too big to fit into its original place. Currently I have no recent glib source to check if I’m right.
The original string could help a lot to find the root cause.
Ps.: the escaping works as replacing the original byte with \xHH, so theoretically it can only grows from 1 byte to 4, which should fit into a buffer 6 times bigger than the original size.
From: syslog-ng [mailto:syslog-ng-bounces@lists.balabit.hu] On Behalf Of James Elstone
Sent: Thursday, January 05, 2017 10:35 PM
To: syslog-ng@lists.balabit.hu
Subject: [syslog-ng] Hitting g_assert when using sanitize-utf8 enabled!
Hi Balabit et al,
When using the sanitize-utf8 flag I am hitting a g_assert in modules/syslogformat/syslog-format.c; what could be causing this?
Any advice welcome!!
Kr,
James