[or-cvs] eventdns: check for malloc() failures.

Nick Mathewson nickm at seul.org
Fri Jul 7 17:31:59 UTC 2006


Update of /home/or/cvsroot/tor/src/or
In directory moria:/tmp/cvs-serv1907/src/or

Modified Files:
	eventdns.c 
Log Message:
eventdns: check for malloc() failures.

Index: eventdns.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/eventdns.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -p -d -r1.8 -r1.9
--- eventdns.c	5 Jul 2006 21:28:37 -0000	1.8
+++ eventdns.c	7 Jul 2006 17:31:56 -0000	1.9
@@ -3,8 +3,8 @@
 // Modified from agl's original; see CVS for more info.
 // Try to keep this re-mergeable by Adam.  Don't make it depend on Tor.
 // TODO:
-//   - Check all malloc return values.
 //   - Learn about nameservers on win32.
+//   - Support AAAA (?), A6, and PTR records.
 
 /* Async DNS Library
  * Adam Langley <agl at imperialviolet.org>
@@ -278,7 +278,12 @@ typedef unsigned int uint;
 #define MAX_ADDRS 4  // maximum number of addresses from a single packet
 // which we bother recording
 
-#define TYPE_A 1
+#define TYPE_A         1
+#define TYPE_CNAME     5
+#define TYPE_PTR      12
+#define TYPE_AAAA     28
+#define TYPE_A6       38
+
 #define CLASS_INET 1
 
 struct request {
@@ -767,6 +772,7 @@ reply_parse(u8 *packet, int length) {
 
 		if (type == TYPE_A && class == CLASS_INET) {
 			const int addrcount = datalength >> 2;  // each IP address is 4 bytes
+                        // XXXX do something sane with malformed A answers.
 			const int addrtocopy = MIN(MAX_ADDRS - addresses_done, addrcount);
 
 			ttl_r = MIN(ttl_r, ttl);
@@ -997,6 +1003,7 @@ eventdns_request_data_build(const char *
 	APPEND16(0);  // no additional
 
 	labels = (u8 *) malloc(name_len + 2);
+        if (!labels) return -1;
 	labels_len = dnsname_to_labels(labels, name, name_len);
 	if (labels_len < 0) return labels_len;
 	memcpy(buf + j, labels, labels_len);
@@ -1115,6 +1122,7 @@ nameserver_send_probe(struct nameserver 
   	log("Sending probe to %s", debug_ntoa(ns->address));
 
 	req = request_new("www.google.com", DNS_QUERY_NO_SEARCH, nameserver_probe_callback, ns);
+        if (!req) return;
 	// we force this into the inflight queue no matter what
 	request_trans_id_set(req, transaction_id_pick());
 	req->ns = ns;
@@ -1161,6 +1169,7 @@ eventdns_nameserver_add(unsigned long in
 	}
 
 	ns = (struct nameserver *) malloc(sizeof(struct nameserver));
+        if (!ns) return -1;
 
 	memset(ns, 0, sizeof(struct nameserver));
 
@@ -1277,6 +1286,7 @@ request_new(const char *name, int flags,
 	// the request data is alloced in a single block with the header
 	struct request *const req = (struct request *) malloc(sizeof(struct request) + request_max_len);
 	int rlen;
+        if (!req) return NULL;
 	memset(req, 0, sizeof(struct request));
 
 	// request data lives just after the header
@@ -1370,6 +1380,7 @@ search_state_decref(struct search_state 
 static struct search_state *
 search_state_new(void) {
 	struct search_state *state = (struct search_state *) malloc(sizeof(struct search_state));
+        if (!state) return NULL;
 	memset(state, 0, sizeof(struct search_state));
 	state->refcount = 1;
 	state->ndots = 1;
@@ -1398,9 +1409,11 @@ search_postfix_add(const char *domain) {
 	domain_len = strlen(domain);
 
 	if (!global_search_state) global_search_state = search_state_new();
+        if (!global_search_state) return;
 	global_search_state->num_domains++;
 
 	sdomain = (struct search_domain *) malloc(sizeof(struct search_domain) + domain_len);
+        if (!sdomain) return;
 	memcpy( ((u8 *) sdomain) + sizeof(struct search_domain), domain, domain_len);
 	sdomain->next = global_search_state->head;
 	sdomain->len = domain_len;
@@ -1434,6 +1447,7 @@ eventdns_search_add(const char *domain) 
 void
 eventdns_search_ndots_set(const int ndots) {
 	if (!global_search_state) global_search_state = search_state_new();
+        if (!global_search_state) return;
 	global_search_state->ndots = ndots;
 }
 
@@ -1462,6 +1476,7 @@ search_make_new(const struct search_stat
 			const u8 *const postfix = ((u8 *) dom) + sizeof(struct search_domain);
 			const int postfix_len = dom->len;
 			char *const newname = (char *) malloc(base_len + need_to_append_dot + postfix_len + 1);
+                        if (!newname) return NULL;
 			memcpy(newname, base_name, base_len);
 			if (need_to_append_dot) newname[base_len] = '.';
 			memcpy(newname + base_len + need_to_append_dot, postfix, postfix_len);
@@ -1487,6 +1502,7 @@ search_request_new(const char *const nam
 			req->search_index = -1;
 		} else {
 			char *const new_name = search_make_new(global_search_state, 0, name);
+                        if (!new_name) return 1;
 			req = request_new(new_name, flags, user_callback, user_arg);
 			free(new_name);
 			if (!req) return 1;
@@ -1534,6 +1550,7 @@ search_try_next(struct request *const re
 		}
 
 		new_name = search_make_new(req->search_state, req->search_index, req->search_origname);
+                if (!new_name) return 1;
 		log("Search: now trying %s (%d)", new_name, req->search_index);
 		newreq = request_new(new_name, req->search_flags, req->user_callback, req->user_pointer);
 		free(new_name);
@@ -1629,6 +1646,7 @@ resolv_conf_parse_line(char *const start
 				if (!(flags & DNS_OPTION_SEARCH)) continue;
 				log("Setting ndots to %d", ndots);
 				if (!global_search_state) global_search_state = search_state_new();
+                                if (!global_search_state) return;
 				global_search_state->ndots = ndots;
 			} else if (!strncmp(option, "timeout:", 8)) {
 				const int timeout = strtoint(&option[8]);



More information about the tor-commits mailing list