# HG changeset patch # User Evan Schoenberg # Date 1163276975 0 # Node ID 0c80979077cf402b022a2a6ce6df22b7c2883543 # Parent c9c1ce4a70b670486a62228ce9350d1a3101aaa6 [gaim-migrate @ 17738] * Patch from Christopher "cuberoot" to fix the repeated, CPU-intensive call loop on url_fetch_recv_cb() which was discussed on gaim-devl with the subject "Yahoo (and maybe others): gaim_util_fetch_url_request() at 100% CPU until complete with repeated EAGAIN". He writes: "When read() returns 0, that means eof... period. Don't check errno, don't collect $200. The loop was caused by eof condition when errno had previously been EAGAIN/EWOULDBLOCK. The CPU-bound loop stopped when errno happened to be overwritten. I also believe trying to use some/part of an HTTP request on ETIMEDOUT to be a mistake so I removed it. Funny enough the read(2) manpage doesn't document ETIMEDOUT as a possible errno, but it is. (see tcp_timer.c and tcp_subr.c in src/sys/netinet)." This closes Adium Trac ticket #5685. * Added some passing-NULL-to-printf() safety which has been sitting around in this file locally for a while, waiting for a worthwhile commit to accompany. committer: Tailor Script diff -r c9c1ce4a70b6 -r 0c80979077cf libgaim/util.c --- a/libgaim/util.c Sat Nov 11 18:23:57 2006 +0000 +++ b/libgaim/util.c Sat Nov 11 20:29:35 2006 +0000 @@ -3315,11 +3315,9 @@ } } - if(len <= 0) { + if(len < 0) { if(errno == EAGAIN) { return; - } else if(errno != ETIMEDOUT) { - got_eof = TRUE; } else { gaim_util_fetch_url_error(gfud, _("Error reading from %s: %s"), gfud->website.address, strerror(errno)); @@ -3327,7 +3325,7 @@ } } - if(got_eof) { + if((len == 0) || got_eof) { gfud->webdata = g_realloc(gfud->webdata, gfud->len + 1); gfud->webdata[gfud->len] = '\0'; @@ -3378,7 +3376,7 @@ if (source == -1) { gaim_util_fetch_url_error(gfud, _("Unable to connect to %s: %s"), - gfud->website.address, error_message); + (gfud->website.address ? gfud->website.address : ""), error_message); return; } @@ -3399,9 +3397,10 @@ "Accept: */*\r\n" "Host: %s\r\n\r\n", (gfud->full ? "" : "/"), - (gfud->full ? gfud->url : gfud->website.page), + (gfud->full ? (gfud->url ? gfud->url : "") : (gfud->website.page ? gfud->website.page : "")), (gfud->http11 ? "1.1" : "1.0"), - gfud->user_agent, gfud->website.address); + (gfud->user_agent ? gfud->user_agent : ""), + (gfud->website.address ? gfud->website.address : "")); } else { gfud->request = g_strdup_printf( "GET %s%s HTTP/%s\r\n" @@ -3409,9 +3408,9 @@ "Accept: */*\r\n" "Host: %s\r\n\r\n", (gfud->full ? "" : "/"), - (gfud->full ? gfud->url : gfud->website.page), + (gfud->full ? (gfud->url ? gfud->url : "") : (gfud->website.page ? gfud->website.page : "")), (gfud->http11 ? "1.1" : "1.0"), - gfud->website.address); + (gfud->website.address ? gfud->website.address : "")); } }