File squid-2.7.x-bnc829084-CVE-2013-4115-BO_request_handling.diff of Package squid

diff -rNU 30 ../squid-2.7.STABLE5-o/src/dns_internal.c ./src/dns_internal.c
--- ../squid-2.7.STABLE5-o/src/dns_internal.c	2008-06-27 22:56:26.000000000 +0200
+++ ./src/dns_internal.c	2013-08-22 10:28:51.000000000 +0200
@@ -1059,60 +1059,66 @@
 
 static int
 idnsCachedLookup(const char *key, IDNSCB * callback, void *data)
 {
     idns_query *q;
     idns_query *old = hash_lookup(idns_lookup_hash, key);
     if (!old)
 	return 0;
     q = cbdataAlloc(idns_query);
     q->tcp_socket = -1;
     q->callback = callback;
     q->callback_data = data;
     cbdataLock(q->callback_data);
     q->queue = old->queue;
     old->queue = q;
     return 1;
 }
 
 static void
 idnsCacheQuery(idns_query * q)
 {
     q->hash.key = q->query.name;
     hash_join(idns_lookup_hash, &q->hash);
 }
 
 void
 idnsALookup(const char *name, IDNSCB * callback, void *data)
 {
     unsigned int i;
     int nd = 0;
+    unsigned int namelength = strlen(name);
+    if(namelength > NS_MAXDNAME) {
+	debug(78, 1) ("idnsALookup SECURITY ALERT: name too long: %s",
+            name);
+	return;
+    }
     idns_query *q;
     if (idnsCachedLookup(name, callback, data))
 	return;
     q = cbdataAlloc(idns_query);
     q->tcp_socket = -1;
     q->id = idnsQueryID();
 
     for (i = 0; i < strlen(name); i++) {
 	if (name[i] == '.') {
 	    nd++;
 	}
     }
 
     if (Config.onoff.res_defnames && npc > 0 && name[strlen(name) - 1] != '.') {
 	q->do_searchpath = 1;
     } else {
 	q->do_searchpath = 0;
     }
     strcpy(q->orig, name);
     strcpy(q->name, q->orig);
     if (q->do_searchpath && nd < ndots) {
 	q->domain = 0;
 	strcat(q->name, ".");
 	strcat(q->name, searchpath[q->domain].domain);
 	debug(78, 3) ("idnsALookup: searchpath used for %s\n",
 	    q->name);
     }
     q->sz = rfc1035BuildAQuery(q->name, q->buf, sizeof(q->buf), q->id,
 	&q->query);
 
openSUSE Build Service is sponsored by