Thanks for your effort Cade, I applied your patches on latest from svn - version 4.3.0 and it has been working for 3days now. Best Regards, Steinar M. On Mon, Feb 15, 2010 at 4:21 PM, Cade Robinson <cade.robinson at gmail.com>wrote:
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) {
To unsubscribe from the hobbit list, send an e-mail to hobbit-unsubscribe at hswn.dk