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 : ""));
 		}
 	}