Mercurial > pidgin
changeset 14959:0c80979077cf
[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 <tailor@pidgin.im>
author | Evan Schoenberg <evan.s@dreskin.net> |
---|---|
date | Sat, 11 Nov 2006 20:29:35 +0000 |
parents | c9c1ce4a70b6 |
children | 91d8fb14bd27 |
files | libgaim/util.c |
diffstat | 1 files changed, 8 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- 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 : "")); } }