Here are possible patches affecting hobbitfetch

Cade Robinson cade.robinson at gmail.com
Mon Feb 15 17:21:05 CET 2010



I have been having some issues with hobbitfetch and have modified a few
files to fix them.  At least my definition of fixed in that hobbitfetch
now works - but the way they are fixed may not be right.

include/libbbgen.h
Change IP_ADDR_STRLEN from 16 to 22.
The reason is that I was getting reports from IP:port and that is 22
chars with the trailing NULL.  At 16 I was getting multi-source reports
and the the host shown in "Status message received from" was truncated
otherwise.

hobbitd/hobbitd.c
Again related to the above - took out he %16s because my host could be
22 chars.

hobbitd/hobbitfetch.c
Lowered res from 100 to 25 - same as above so it could really be 22. Not
much of a change but save a bit of mem.

Change the read to read two less bytes than sizeof(buf) and set buf[n-1]
to NULL.  This is in case 8192 bytes are sent/read.  Since buf is 8192
elements long the last element is 8191 not 8192 so buf[n]=\0; when 8192
bytes are read causes a segfault.  I think the same should be done in
msgcache.c as well but I haven't seen anything over 100 bytes be sent to
msgcache.




Here are the patches:
Index: include/libbbgen.h
===================================================================
--- include/libbbgen.h  (revision 6223)
+++ include/libbbgen.h  (working copy)
@@ -27,7 +27,7 @@
#define STRBUF(buf) (buf->s)
#define STRBUFLEN(buf) (buf->used)

-#define IP_ADDR_STRLEN 16
+#define IP_ADDR_STRLEN 22

#include "version.h"
#include "config.h"
Index: hobbitd/hobbitd.c
===================================================================
--- hobbitd/hobbitd.c   (revision 6223)
+++ hobbitd/hobbitd.c   (working copy)
@@ -2789,7 +2789,7 @@
                        /* Pick out the real sender of this message */
                        msgfrom = strstr(currmsg, "\nStatus message
received from ");
                        if (msgfrom) {
-                               sscanf(msgfrom, "\nStatus message
received from %16s\n", sender);
+                               sscanf(msgfrom, "\nStatus message
received from %s\n", sender);
                                *msgfrom = '\0';
                        }

@@ -2866,7 +2866,7 @@
        else if (strncmp(msg->buf, "status", 6) == 0) {
                msgfrom = strstr(msg->buf, "\nStatus message received
from ");
                if (msgfrom) {
-                       sscanf(msgfrom, "\nStatus message received from
%16s\n", sender);
+                       sscanf(msgfrom, "\nStatus message received from
%s\n", sender);
                        *msgfrom = '\0';
                }

@@ -2907,7 +2907,7 @@

                msgfrom = strstr(msg->buf, "\nStatus message received
from ");
                if (msgfrom) {
-                       sscanf(msgfrom, "\nStatus message received from
%16s\n", sender);
+                       sscanf(msgfrom, "\nStatus message received from
%s\n", sender);
                        *msgfrom = '\0';
                }

@@ -3668,7 +3668,7 @@
                if (msgfrom) {
                        char *ipline = strstr(msgfrom, "\nClientIP:");
                        if (ipline) {
-                               sscanf(ipline, "\nClientIP:%16s\n",
sender);
+                               sscanf(ipline, "\nClientIP:%s\n",
sender);
                        }
                }

Index: hobbitd/hobbitfetch.c
===================================================================
--- hobbitd/hobbitfetch.c       (revision 6223)
+++ hobbitd/hobbitfetch.c       (working copy)
@@ -100,7 +100,7 @@

char *addrstring(struct sockaddr_in *addr)
{
-       static char res[100];
+       static char res[25];

        sprintf(res, "%s:%d", inet_ntoa(addr->sin_addr),
ntohs(addr->sin_port));
        return res;
@@ -346,7 +346,7 @@
        char buf[8192];

        /* 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) {
                /* Read failure */
                time_t now = gettimer();
@@ -361,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) {





More information about the Xymon mailing list