[syslog-ng] problems with Cisco WiFi controller syslog messages

Poley, Jason jpoley at co.santa-barbara.ca.us
Fri Jul 20 18:32:34 CEST 2007


Well, I seem to be doing something wrong with patch...

I created a patch file from the enclosed update, starting from the 'diff'
line down to the end (no including your sig of course).  I then run patch
and see the following output...

-------------<paste>-----------
[jpoley at ITS-syslog src]$ patch -p2 -b -i patchfile 
patching file logmsg.c
Hunk #1 succeeded at 229 with fuzz 1.
missing header for unified diff at line 56 of patch
can't find file to patch at input line 56
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|     {
|       /* RFC 3164 timestamp, expected format: MMM DD HH:MM:SS ... */
|       struct tm tm, *nowtm;
|+      glong usec = 0;
| 
|       /* Just read the buffer data into a textual
|          datestamp. */
|+         
| 
|       g_string_assign_len(&self->date, src, 15);
|       src += 15;
|       left -= 15;
| 
|+      if (left > 0 && src[0] == '.')
|+        {
|+          gulong frac = 0;
|+          gint div = 1;
|+          gint i = 1;
|+          
|+          /* gee, funny Cisco extension, BSD timestamp with fraction of 
|+ second support */
|+
|+          while (i < left && div < 10e6 && isdigit(src[i]))
|+            {
|+              frac = 10 * frac + (src[i]) - '0';
|+              div = div * 10;
|+              i++;
|+            }
|+          usec = frac * (1000000 / div);
|+          left -= i;
|+          src += i;
|+        }
|+
|       /* And also make struct time timestamp for the msg */
| 
|       nowtm = localtime(&now);
--------------------------
File to patch: logmsg.c
patching file logmsg.c
Hunk #1 succeeded at 313 with fuzz 1 (offset -26 lines).
------------<end paste>------------

I then ran diff to see if it worked correctly and it seems that only one
line changed?

--------<paste>---------
[jpoley at ITS-syslog src]$ diff logmsg.c logmsg.c.orig
295c295
<       self->stamp.time.tv_usec = usec;
---
>       self->stamp.time.tv_usec = 0;
[jpoley at ITS-syslog src]$
--------<end paste>---------

What am I doing wrong?

JDP
---------------------------------
Jason D Poley
Network Tech
GS ITS Network 
County of Santa Barbara
805.568.2680
jpoley at co.santa-barbara.ca.us 


-----Original Message-----
From: Balazs Scheidler [mailto:bazsi at balabit.hu] 
Sent: Thursday, July 19, 2007 2:25 PM
To: Syslog-ng users' and developers' mailing list
Cc: Poley, Jason
Subject: RE: [syslog-ng] problems with Cisco WiFi controller syslog messages

On Thu, 2007-07-19 at 11:09 -0700, Poley, Jason wrote:
> Bazsi,
> 
> So I finally got around to the upgrade this morning (now on 2.0.4), only
one
> month later...
> 
> Is it possible you can help with these obviously non-standard Cisco syslog
> timestamps?

The attached patch should do it. Please report back if it indeed worked,
I could only test it with a small unit test program. While doing this
I've also found a minor issue with fraction support on ISO timestamps,
an integer overflow could have caused an invalid value, if second
fraction was specified with more than 4 digits, because the formula:

usec = frac * 1000000 / div

could overflow, whenever frac is over 4294 (2^32/10e6). After using
proper parentheses, the issue is gone.

diff --git a/src/logmsg.c b/src/logmsg.c
index 4ea6fb0..2ab8ae1 100644
--- a/src/logmsg.c
+++ b/src/logmsg.c
@@ -229,13 +229,13 @@ log_msg_parse(LogMessage *self, gchar *data, gint
length, guint flags, regex_t *
           /* process second fractions */
           
           p++;
-          while (isdigit(*p))
+          while (div < 10e6 && isdigit(*p))
             {
               frac = 10 * frac + (*p) - '0';
               div = div * 10;
               p++;
             }
-          self->stamp.time.tv_usec = frac * 1000000 / div;
+          self->stamp.time.tv_usec = frac * (1000000 / div);
         }
       if (p && (*p == '+' || *p == '-') && strlen(p) == 6 && 
           isdigit(*(p+1)) && isdigit(*(p+2)) && *(p+3) == ':' &&
isdigit(*(p+4)) && isdigit(*(p+5)))
@@ -298,14 +298,35 @@ log_msg_parse(LogMessage *self, gchar *data, gint
length, guint flags, regex_t *
     {
       /* RFC 3164 timestamp, expected format: MMM DD HH:MM:SS ... */
       struct tm tm, *nowtm;
+      glong usec = 0;
 
       /* Just read the buffer data into a textual
          datestamp. */
+         
 
       g_string_assign_len(&self->date, src, 15);
       src += 15;
       left -= 15;
 
+      if (left > 0 && src[0] == '.')
+        {
+          gulong frac = 0;
+          gint div = 1;
+          gint i = 1;
+          
+          /* gee, funny Cisco extension, BSD timestamp with fraction of
second support */
+
+          while (i < left && div < 10e6 && isdigit(src[i]))
+            {
+              frac = 10 * frac + (src[i]) - '0';
+              div = div * 10;
+              i++;
+            }
+          usec = frac * (1000000 / div);
+          left -= i;
+          src += i;
+        }
+
       /* And also make struct time timestamp for the msg */
 
       nowtm = localtime(&now);
@@ -318,7 +339,7 @@ log_msg_parse(LogMessage *self, gchar *data, gint
length, guint flags, regex_t *
         
       /* NOTE: no timezone information in the message, assume it is local
time */
       self->stamp.time.tv_sec = mktime(&tm);
-      self->stamp.time.tv_usec = 0;
+      self->stamp.time.tv_usec = usec;
       self->stamp.zone_offset =
get_local_timezone_ofs(self->stamp.time.tv_sec); /* assume local timezone */
     }
     

-- 
Bazsi


-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 7998 bytes
Desc: not available
Url : http://lists.balabit.hu/pipermail/syslog-ng/attachments/20070720/d85a8122/smime.bin


More information about the syslog-ng mailing list