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) {