[hobbit] msgcache hobbitfetch problems

Cade Robinson cade.robinson at gmail.com
Mon Feb 8 19:53:48 CET 2010


The issue is in the hobbitfetch "grabdata" function.

int n;
char buf[8192];
...
n = read(conn->sockfd, buf, sizeof(buf));
...
else if (n > 0) {
...
buf[n] = '\0';
...

If the "read" reads 8192 bytes then n is 8192 and then buf[n] tries to
get set to NULL.  There is no element 8192.
Also only one read happens so if there is more than 8192 bytes to be
fetched not everything is fetched.

I put the "read" and "if"s in a do...while loop and fixed the null
termination on buf and haven't had any issues.

~/hobbitmon/trunk/hobbitd:-> diff -u hobbitfetch.c ./hobbitfetch.c.new
--- hobbitfetch.c       2010-02-08 12:43:22.781543905 -0600
+++ ./hobbitfetch.c.new 2010-02-08 12:52:25.249509306 -0600
@@ -342,8 +342,9 @@
     int n;
     char buf[8192];

+    do {
     /* Read data from a peer connection (client or server) */
-        n = read(conn->sockfd, buf, sizeof(buf));
+        n = read(conn->sockfd, buf, sizeof(buf)-2);
     if (n == -1) {
         if ((errno != EINTR) && (errno != EAGAIN)) {
             /* Read failure */
@@ -360,7 +361,7 @@
         /* Save the data */
         dbgprintf("Got %d bytes of data from %s (req %lu)\n",
             n, addrstring(&conn->caddr), conn->seq);
-        buf[n] = '\0';
+        buf[n+1] = '\0';
         addtobuffer(conn->msgbuf, buf);
     }
     else if (n == 0) {
@@ -380,6 +381,7 @@
             break;
         }
     }
+    } while (n>0);
 }

 void set_polltime(clients_t *client)







On Mon, 2010-02-08 at 18:12 +0000, Steinar M. Skúlason wrote:
> 
> 
> On Mon, Feb 8, 2010 at 5:36 PM, Daniel McDonald
> <dan.mcdonald at austinenergy.com> wrote:
>         On 2/8/10 10:37 AM, "Steinar M. Skúlason"
>         <steinarms at gmail.com> wrote:
>         
>         > Hi,
>         >
>         > I'm having problems with "msgcache" on the client machines
>         and "hobbitfetch"
>         > on the server machine.
>         > It works for a short period and then get's stuck and all my
>         client side checks
>         > end up with status purple.
>         
>         
>         Yup.  Been doing that for a long time here.  I sent a bunch of
>         corefiles to
>         Henrik about it, and he tried a bunch of patches.  Eventually,
>         we just wrote
>         a routine that restarts hobbitfetch whenever a host turns
>         purple.
>         
>         --
>         Daniel J McDonald, CCIE # 2495, CISSP # 78281
>         
>         
>         To unsubscribe from the hobbit list, send an e-mail to
>         hobbit-unsubscribe at hswn.dk
>         
>         
>  
> Ok, good to hear that I am not the only one.
> I wrote a ugly routine that restarts hobbitfetch if there is no new
> entry in the logfile
> 
> 
> #!/bin/bash
> 
> #This is to see if any progress has been made within the hobbitfetch
> utility.
> TMP_FILE=/tmp/tmp.hobbitfetch.last
> LAST_LINE=`tail -1 /usr/lib/xymon/server/log/hobbitfetch.log|awk
> '{print $1 $2}'`
> PREV_LINE=`cat /tmp/tmp.hobbitfetch.last`
> echo $LAST_LINE > $TMP_FILE
> 
> if [ "$LAST_LINE" == "$PREV_LINE" ]; then
>   echo "Nothing has happend .... killing hobbitfetch!"
>   PID=`ps -ef|grep hobbitfetch|awk '{print $2}'`
>   kill -9 $PID
> fi
> 
> Best Regards,
> Steinar M.




More information about the Xymon mailing list