[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [hobbit] msgcache hobbitfetch problems



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.