PERFORCE change 103514 for review

Michael Bushkov bushman at FreeBSD.org
Wed Aug 9 16:34:05 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=103514

Change 103514 by bushman at bushman_nss_ldap_cached on 2006/08/09 16:33:48

	Possible memory errors in usr.sbin/cached are now properly handled. No more asserts after mallocs, asprintfs, vasprintfs and strdups. Some minor memory error handling issues fixed.

Affected files ...

.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agent.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agent.h#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/group.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/hosts.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/net.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/passwd.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/proto.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/rpc.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/services.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cached.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cachedcli.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cachelib.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cacheplcs.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/config.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/config.h#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/hashtable.h#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/log.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/log.h#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/mp_rs_query.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/mp_ws_query.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/parser.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/query.c#3 edit

Differences ...

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agent.c#4 (text) ====

@@ -109,14 +109,17 @@
 
 	TRACE_IN(init_agent_table);
 	retval = (struct agent_table *)malloc(sizeof(struct agent_table));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_agent_table);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct agent_table));
 
 	TRACE_OUT(init_agent_table);
 	return (retval);
 }
 
-void
+int
 register_agent(struct agent_table *at, struct agent *a)
 {
 	struct agent **new_agents;
@@ -124,11 +127,20 @@
 
 	TRACE_IN(register_agent);
 	assert(at != NULL);
-	assert(a != NULL);
+
+	if (a == NULL) {
+		TRACE_OUT(register_agent);
+		return (-1);
+	}
+
 	new_agents_num = at->agents_num + 1;
 	new_agents = (struct agent **)malloc(sizeof(struct agent *) *
 		new_agents_num);
-	assert(new_agents != NULL);
+	if (new_agents == NULL) {
+		TRACE_OUT(register_agent);
+		return (-1);
+	}
+	
 	memcpy(new_agents, at->agents, at->agents_num * sizeof(struct agent *));
 	new_agents[new_agents_num - 1] = a;
 	qsort(new_agents, new_agents_num, sizeof(struct agent *),
@@ -138,6 +150,8 @@
 	at->agents = new_agents;
 	at->agents_num = new_agents_num;
     	TRACE_OUT(register_agent);
+	
+	return (0);
 }
 
 struct agent *

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agent.h#4 (text) ====

@@ -158,7 +158,7 @@
 extern int agent_marshal_results(char **, size_t *, agent_marshal_func, 
 	void *, void *, ...);
 extern struct agent_table *init_agent_table();
-extern void register_agent(struct agent_table *, struct agent *);
+extern int register_agent(struct agent_table *, struct agent *);
 extern struct agent *find_agent(struct agent_table *, const char *,
 	enum agent_type);
 extern void destroy_agent_table(struct agent_table *);

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/group.c#4 (text) ====

@@ -188,7 +188,10 @@
 	case nss_lt_name:
 		size = key_size - sizeof(enum nss_lookup_type)  + 1;
 		name = (char *)malloc(size);
-		assert(name != NULL);
+		if (name == NULL) {
+			TRACE_OUT(group_lookup_func);
+			return (NS_UNAVAIL);
+		}
 		memset(name, 0, size);
 		memcpy(name, key + sizeof(enum nss_lookup_type), size - 1);
                 break;
@@ -330,11 +333,18 @@
 
 	TRACE_IN(init_group_agent);
 	retval = (struct common_agent *)malloc(sizeof(struct common_agent));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_group_agent);
+		return (NULL);
+	}	
 	memset(retval, 0, sizeof(struct common_agent));
 
 	retval->parent.name = strdup("group");
-	assert(retval->parent.name != NULL);
+	if (retval->parent.name == NULL) {
+		free(retval);
+		TRACE_OUT(init_group_agent);
+		return (NULL);
+	}
 
 	retval->parent.type = COMMON_AGENT;
 	retval->lookup_func = group_lookup_func;
@@ -351,15 +361,22 @@
 	TRACE_IN(init_group_mp_agent);
 	retval = (struct multipart_agent *)malloc(
 		sizeof(struct multipart_agent));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_group_mp_agent);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct multipart_agent));
 
 	retval->parent.name = strdup("group");
+	if (retval->parent.name == NULL) {
+		free(retval);
+		TRACE_OUT(init_group_mp_agent);
+		return (NULL);
+	}
 	retval->parent.type = MULTIPART_AGENT;
 	retval->mp_init_func = group_mp_init_func;
 	retval->mp_lookup_func = group_mp_lookup_func;
-	retval->mp_destroy_func = group_mp_destroy_func;
-	assert(retval->parent.name != NULL);
+	retval->mp_destroy_func = group_mp_destroy_func;	
 
 	TRACE_OUT(init_group_mp_agent);
 	return ((struct agent *)retval);

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/hosts.c#3 (text+ko) ====

@@ -302,7 +302,10 @@
 		
 		size = key_size + 1;
 		str = (char *)malloc(size);
-		assert(str != NULL);
+		if (str == NULL) {
+			TRACE_OUT(hosts_lookup_func);
+			return (NS_UNAVAIL);
+		}
 		memset(str, 0, size);
 		memcpy(str, key, key_size);
 		
@@ -336,7 +339,10 @@
 		case nss_lt_name:					
 			size = key_size + 1;
 			str = (char *)malloc(size);
-			assert(str != NULL);
+			if (str == NULL) {
+				TRACE_OUT(hosts_lookup_func);
+				return (NS_UNAVAIL);
+			}
 			memset(str, 0, size);
 			memcpy(str, key, key_size);
 			break;
@@ -440,11 +446,18 @@
 
 	TRACE_IN(init_hosts_agent);
 	retval = (struct common_agent *)malloc(sizeof(struct common_agent));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_hosts_agent);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct common_agent));
 
 	retval->parent.name = strdup("hosts");
-	assert(retval->parent.name != NULL);
+	if (retval->parent.name == NULL) {
+		free(retval);
+		TRACE_OUT(init_hosts_agent);
+		return (NULL);
+	}
 
 	retval->parent.type = COMMON_AGENT;
 	retval->lookup_func = hosts_lookup_func;

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/net.c#3 (text+ko) ====

@@ -184,7 +184,10 @@
 	case nss_lt_name:
 		size = key_size - sizeof(enum nss_lookup_type)  + 1;
 		name = (char *)malloc(size);
-		assert(name != NULL);
+		if (name == NULL) {
+			TRACE_OUT(networks_lookup_func);
+			return (NS_UNAVAIL);
+		}
 		memset(name, 0, size);
 		memcpy(name, key + sizeof(enum nss_lookup_type), size - 1);
 		break;
@@ -274,11 +277,18 @@
 
 	TRACE_IN(init_networks_agent);
 	retval = (struct common_agent *)malloc(sizeof(struct common_agent));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_networks_agent);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct common_agent));
 
 	retval->parent.name = strdup("networks");
-	assert(retval->parent.name != NULL);
+	if (retval->parent.name == NULL) {
+		free(retval);
+		TRACE_OUT(init_networks_agent);
+		return (NULL);
+	}
 
 	retval->parent.type = COMMON_AGENT;
 	retval->lookup_func = networks_lookup_func;

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/passwd.c#4 (text) ====

@@ -187,7 +187,10 @@
 	case nss_lt_name:
 		size = key_size - sizeof(enum nss_lookup_type)  + 1;
 		login = (char *)malloc(size);
-		assert(login != NULL);
+		if (login == NULL) {
+			TRACE_OUT(passwd_lookup_func);
+			return (NS_UNAVAIL);
+		}
 		memset(login, 0, size);
 		memcpy(login, key + sizeof(enum nss_lookup_type), size - 1);
 		break;
@@ -329,11 +332,18 @@
 
 	TRACE_IN(init_passwd_agent);
 	retval = (struct common_agent *)malloc(sizeof(struct common_agent));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_passwd_agent);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct common_agent));
 
 	retval->parent.name = strdup("passwd");
-	assert(retval->parent.name != NULL);
+	if (retval->parent.name == NULL) {
+		free(retval);
+		TRACE_OUT(init_passwd_agent);
+		return (NULL);
+	}
 
 	retval->parent.type = COMMON_AGENT;
 	retval->lookup_func = passwd_lookup_func;
@@ -350,15 +360,22 @@
 	TRACE_IN(init_passwd_mp_agent);
 	retval = (struct multipart_agent *)malloc(
 		sizeof(struct multipart_agent));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_passwd_mp_agent);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct multipart_agent));
 
 	retval->parent.name = strdup("passwd");
+	if (retval->parent.name == NULL) {
+		free(retval);
+		TRACE_OUT(init_passwd_mp_agent);
+		return (NULL);
+	}
 	retval->parent.type = MULTIPART_AGENT;
 	retval->mp_init_func = passwd_mp_init_func;
 	retval->mp_lookup_func = passwd_mp_lookup_func;
-	retval->mp_destroy_func = passwd_mp_destroy_func;
-	assert(retval->parent.name != NULL);
+	retval->mp_destroy_func = passwd_mp_destroy_func;	
 
 	TRACE_OUT(init_passwd_mp_agent);
 	return ((struct agent *)retval);

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/proto.c#3 (text+ko) ====

@@ -180,7 +180,10 @@
 	case nss_lt_name:
 		size = key_size - sizeof(enum nss_lookup_type)  + 1;
 		name = (char *)malloc(size);
-		assert(name != NULL);
+		if (name == NULL) {
+			TRACE_OUT(protocols_lookup_func);
+			return (NS_UNAVAIL);
+		}
 		memset(name, 0, size);
 		memcpy(name, key + sizeof(enum nss_lookup_type), size - 1);
 		break;
@@ -326,11 +329,18 @@
 
 	TRACE_IN(init_protocols_agent);
 	retval = (struct common_agent *)malloc(sizeof(struct common_agent));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_protocols_agent);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct common_agent));
 
 	retval->parent.name = strdup("protocols");
-	assert(retval->parent.name != NULL);
+	if (retval->parent.name == NULL) {
+		free(retval);
+		TRACE_OUT(init_protocols_agent);
+		return (NULL);
+	}
 
 	retval->parent.type = COMMON_AGENT;
 	retval->lookup_func = protocols_lookup_func;
@@ -347,15 +357,22 @@
 	TRACE_IN(init_protocols_mp_agent);
 	retval = (struct multipart_agent *)malloc(
 		sizeof(struct multipart_agent));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_protocols_mp_agent);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct multipart_agent));
 
 	retval->parent.name = strdup("protocols");
+	if (retval->parent.name == NULL) {
+		free(retval);
+		TRACE_OUT(init_protocols_mp_agent);
+		return (NULL);
+	}
 	retval->parent.type = MULTIPART_AGENT;
 	retval->mp_init_func = protocols_mp_init_func;
 	retval->mp_lookup_func = protocols_mp_lookup_func;
-	retval->mp_destroy_func = protocols_mp_destroy_func;
-	assert(retval->parent.name != NULL);
+	retval->mp_destroy_func = protocols_mp_destroy_func;	
 
 	TRACE_OUT(init_protocols_mp_agent);
 	return ((struct agent *)retval);

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/rpc.c#3 (text+ko) ====

@@ -176,7 +176,10 @@
 	case nss_lt_name:
 		size = key_size - sizeof(enum nss_lookup_type)  + 1;
 		name = (char *)malloc(size);
-		assert(name != NULL);
+		if (name == NULL) {
+			TRACE_OUT(rpc_lookup_func);
+			return (NS_UNAVAIL);
+		}
 		memset(name, 0, size);
 		memcpy(name, key + sizeof(enum nss_lookup_type), size - 1);
 		break;
@@ -322,11 +325,18 @@
 
 	TRACE_IN(init_rpc_agent);
 	retval = (struct common_agent *)malloc(sizeof(struct common_agent));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_rpc_agent);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct common_agent));
 
 	retval->parent.name = strdup("rpc");
-	assert(retval->parent.name != NULL);
+	if (retval->parent.name == NULL) {
+		free(retval);
+		TRACE_OUT(init_rpc_agent);
+		return (NULL);
+	}
 
 	retval->parent.type = COMMON_AGENT;
 	retval->lookup_func = rpc_lookup_func;
@@ -343,15 +353,22 @@
 	TRACE_IN(init_rpc_mp_agent);
 	retval = (struct multipart_agent *)malloc(
 		sizeof(struct multipart_agent));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_rpc_mp_agent);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct multipart_agent));
 
 	retval->parent.name = strdup("rpc");
+	if (retval->parent.name == NULL) {
+		free(retval);
+		TRACE_OUT(init_rpc_mp_agent);
+		return (NULL);
+	}
 	retval->parent.type = MULTIPART_AGENT;
 	retval->mp_init_func = rpc_mp_init_func;
 	retval->mp_lookup_func = rpc_mp_lookup_func;
-	retval->mp_destroy_func = rpc_mp_destroy_func;
-	assert(retval->parent.name != NULL);
+	retval->mp_destroy_func = rpc_mp_destroy_func;	
 
 	TRACE_OUT(init_rpc_mp_agent);
 	return ((struct agent *)retval);

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/services.c#4 (text) ====

@@ -185,7 +185,10 @@
 	switch (lookup_type) {
 		size = key_size - sizeof(enum nss_lookup_type);
 		name = (char *)malloc(size + 1);
-		assert(name != NULL);
+		if (name == NULL) {
+			result = NS_UNAVAIL;
+			goto fin;
+		}
 		memset(name, 0, size + 1);
 		memcpy(name, key + sizeof(enum nss_lookup_type), size);
 
@@ -209,7 +212,10 @@
 		size = key_size - sizeof(enum nss_lookup_type) - sizeof(int);
 		if (size > 0) {
 			proto = (char *)malloc(size + 1);
-			assert(proto != NULL);
+			if (proto == NULL) {
+				result = NS_UNAVAIL;
+				goto fin;
+			}
 			memset(proto, size + 1, 0);
 			memcpy(proto, key + sizeof(enum nss_lookup_type) +
 				sizeof(int), size);
@@ -347,11 +353,18 @@
 	TRACE_IN(init_services_agent);
 
 	retval = (struct common_agent *)malloc(sizeof(struct common_agent));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_services_agent);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct common_agent));
 
 	retval->parent.name = strdup("services");
-	assert(retval->parent.name != NULL);
+	if (retval->parent.name == NULL) {
+		free(retval);
+		TRACE_OUT(init_services_agent);
+		return (NULL);
+	}
 
 	retval->parent.type = COMMON_AGENT;
 	retval->lookup_func = services_lookup_func;
@@ -368,15 +381,22 @@
 	TRACE_IN(init_services_mp_agent);
 	retval = (struct multipart_agent *)malloc(
 		sizeof(struct multipart_agent));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_services_mp_agent);
+		return (NULL);
+	}		
 	memset(retval, 0, sizeof(struct multipart_agent));
 
 	retval->parent.name = strdup("services");
+	if (retval->parent.name == NULL) {
+		free(retval);
+		TRACE_OUT(init_services_mp_agent);
+		return (NULL);
+	}
 	retval->parent.type = MULTIPART_AGENT;
 	retval->mp_init_func = services_mp_init_func;
 	retval->mp_lookup_func = services_mp_lookup_func;
 	retval->mp_destroy_func = services_mp_destroy_func;
-	assert(retval->parent.name != NULL);
 
 	TRACE_OUT(init_services_mp_agent);
 	return ((struct agent *)retval);

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cached.c#4 (text) ====

@@ -135,6 +135,9 @@
 	    	 */
 		res = register_cache_entry(retval, (struct cache_entry_params *)
 			&config_entry->positive_cache_params);
+		if (res != 0)
+			break;
+		
 		config_entry->positive_cache_entry = find_cache_entry(retval,
 			config_entry->positive_cache_params.entry_name);
 		assert(config_entry->positive_cache_entry !=
@@ -142,6 +145,9 @@
 
 		res = register_cache_entry(retval, (struct cache_entry_params *)
 			&config_entry->negative_cache_params);
+		if (res != 0)
+			break;
+		
 		config_entry->negative_cache_entry = find_cache_entry(retval,
 			config_entry->negative_cache_params.entry_name);
 		assert(config_entry->negative_cache_entry !=
@@ -178,7 +184,10 @@
 
 	TRACE_IN(init_runtime_env);
 	retval = (struct runtime_env *)malloc(sizeof(struct runtime_env));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_runtime_env);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct runtime_env));
 
 	retval->sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);
@@ -215,7 +224,12 @@
 	fcntl(retval->sockfd, F_SETFL, O_NONBLOCK);
 
 	retval->queue = kqueue();
-	assert(retval->queue != -1);
+	if (retval->queue == -1) {
+		close(retval->sockfd);
+		free(retval);
+		TRACE_OUT(init_runtime_env);
+		return (NULL);
+	}
 
 	EV_SET(&eventlist, retval->sockfd, EVFILT_READ, EV_ADD | EV_ONESHOT,
 		0, 0, 0);
@@ -424,7 +438,12 @@
 
 			qstate->io_buffer = (char *)malloc(
 				qstate->kevent_watermark);
-			assert(qstate->io_buffer != NULL);
+			if (qstate->io_buffer == NULL) {
+				destroy_query_state(qstate);
+				close(event_data->ident);
+				TRACE_OUT(process_socket_event);
+				return;
+			}
 			memset(qstate->io_buffer, 0, qstate->kevent_watermark);
 
 			qstate->io_buffer_p = qstate->io_buffer;
@@ -653,15 +672,25 @@
 		case 'i':
 			clear_user_cache_entries = 1;
 			if (optarg != NULL)
-				if (strcmp(optarg, "all") != 0)
+				if (strcmp(optarg, "all") != 0) {
 					user_config_entry_name = strdup(optarg);
+					if (user_config_entry_name == NULL) {
+					    LOG_ERR_1("main",
+						"not enough memory");
+					    return (-1);
+					}
+				}
 			break;
 		case 'I':
 			clear_all_cache_entries = 1;
 			if (optarg != NULL)
-				if (strcmp(optarg, "all") != 0)
-					global_config_entry_name =
-						strdup(optarg);
+			    if (strcmp(optarg, "all") != 0) {
+				global_config_entry_name = strdup(optarg);
+				if (global_config_entry_name == NULL) {
+				    LOG_ERR_1("main", "not enough memory");
+				    return (-1);
+				}
+			    }
 			break;
 		case 'd':
 			show_statistics = 1;
@@ -780,31 +809,42 @@
 	pidfile_write(pidfile);
 
 	s_agent_table = init_agent_table();
-	register_agent(s_agent_table, init_passwd_agent());
-	register_agent(s_agent_table, init_passwd_mp_agent());
-	register_agent(s_agent_table, init_group_agent());
-	register_agent(s_agent_table, init_group_mp_agent());
-	register_agent(s_agent_table, init_hosts_agent());
-	register_agent(s_agent_table, init_networks_agent());
-	register_agent(s_agent_table, init_services_agent());
-	register_agent(s_agent_table, init_services_mp_agent());
-	register_agent(s_agent_table, init_protocols_agent());
-	register_agent(s_agent_table, init_protocols_mp_agent());
-	register_agent(s_agent_table, init_rpc_agent());
-	register_agent(s_agent_table, init_rpc_mp_agent());
+	if (s_agent_table == NULL) {
+		LOG_ERR_1("main", "not enough memory");
+		return (-1);		
+	}
+	
+	res = register_agent(s_agent_table, init_passwd_agent());
+	res |= register_agent(s_agent_table, init_passwd_mp_agent());
+	res |= register_agent(s_agent_table, init_group_agent());
+	res |= register_agent(s_agent_table, init_group_mp_agent());
+	res |= register_agent(s_agent_table, init_hosts_agent());
+	res |= register_agent(s_agent_table, init_networks_agent());
+	res |= register_agent(s_agent_table, init_services_agent());
+	res |= register_agent(s_agent_table, init_services_mp_agent());
+	res |= register_agent(s_agent_table, init_protocols_agent());
+	res |= register_agent(s_agent_table, init_protocols_mp_agent());
+	res |= register_agent(s_agent_table, init_rpc_agent());
+	res |= register_agent(s_agent_table, init_rpc_mp_agent());
+	if (res != 0) {
+		LOG_ERR_1("main", "request agetns registration failed: "
+			"not enough memory");
+		return (-1);		
+	}
 	LOG_MSG_1("main", "request agents registered successfully");
 
-	/*
- 	 * Hosts agent can't work properly until we have access to the
-	 * appropriate dtab structures, which are used in nsdispatch
-	 * calls
-	 *
-	 register_agent(s_agent_table, init_hosts_agent());
-	*/
-
 	/* configuration initialization */
 	s_configuration = init_configuration();
-	fill_configuration_defaults(s_configuration);
+	if (s_configuration == NULL) {
+		LOG_ERR_1("main", "not enough memory");
+		return (-1);				
+	}
+	res = fill_configuration_defaults(s_configuration);
+	if (res != 0) {
+		LOG_ERR_1("main", "can't allocate configuration defaults");
+		destroy_configuration(s_configuration);
+		return (-1);
+	}
 
 	error_str = NULL;
 	error_line = 0;
@@ -854,11 +894,22 @@
 	if (s_configuration->threads_num > 1) {
 		threads = (pthread_t *)malloc(sizeof(pthread_t) *
 			s_configuration->threads_num);
+		if (threads == NULL) {
+			LOG_ERR_1("main", "can't allocate memory for threads");
+			destroy_configuration(s_configuration);
+			destroy_cache_(s_cache);
+			return (-1);			
+		}
 		memset(threads, 0, sizeof(pthread_t) *
 	    		s_configuration->threads_num);
 		for (i = 0; i < s_configuration->threads_num; ++i) {
 			thread_args = (struct processing_thread_args *)malloc(
 				sizeof(struct processing_thread_args));
+			if (thread_args == NULL) {
+				LOG_ERR_1("main", "can't allocate memory for"
+				    " thread args for thread #%d", i);
+				continue;
+			}
 			thread_args->the_cache = s_cache;
 			thread_args->the_runtime_env = s_runtime_env;
 			thread_args->the_configuration = s_configuration;
@@ -871,8 +922,10 @@
 			thread_args = NULL;
 		}
 
-		for (i = 0; i < s_configuration->threads_num; ++i)
-			pthread_join(threads[i], NULL);
+		for (i = 0; i < s_configuration->threads_num; ++i) {
+			if (threads[i] != NULL)
+				pthread_join(threads[i], NULL);
+		}
 	} else {
 		LOG_MSG_1("main", "working in single-threaded mode");
 		processing_loop(s_cache, s_runtime_env, s_configuration);

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cachedcli.c#2 (text) ====

@@ -202,20 +202,34 @@
 	fcntl(client_socket, F_SETFL, O_NONBLOCK);
 
 	retval = malloc(sizeof(struct cached_connection_));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(open_cached_connection);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct cached_connection_));
 
 	retval->sockfd = client_socket;
 
 	retval->write_queue = kqueue();
-	assert(retval->write_queue != -1);
+	if (retval->write_queue == -1) {
+		close(retval->sockfd);
+		free(retval);		
+		TRACE_OUT(open_cached_connection);
+		return (NULL);
+	}
 
 	EV_SET(&eventlist, retval->sockfd, EVFILT_WRITE, EV_ADD,
 		0, 0, NULL);
 	res = kevent(retval->write_queue, &eventlist, 1, NULL, 0, NULL);
 
 	retval->read_queue = kqueue();
-	assert(retval->read_queue != -1);
+	if (retval->read_queue != -1) {
+		close(retval->write_queue);
+		close(retval->sockfd);
+		free(retval);		
+		TRACE_OUT(open_cached_connection);
+		return (NULL);
+	}
 
 	EV_SET(&eventlist, retval->sockfd, EVFILT_READ, EV_ADD,
 		0, 0, NULL);

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cachelib.c#2 (text) ====

@@ -480,7 +480,10 @@
 	assert(params != NULL);
 
 	retval = (struct cache_ *)malloc(sizeof(struct cache_));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(init_cache);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct cache_));
 
 	assert(params != NULL);
@@ -488,7 +491,11 @@
 
 	retval->entries = (struct cache_entry_ **)malloc(
 		sizeof(struct cache_entry_ *) * INITIAL_ENTRIES_CAPACITY);
-	assert(retval->entries != NULL);
+	if (retval->entries == NULL) {
+		free(retval);
+		TRACE_OUT(init_cache);
+		return (NULL);
+	}
 	memset(retval->entries, 0, sizeof(sizeof(struct cache_entry_ *)
 		* INITIAL_ENTRIES_CAPACITY));
 
@@ -543,7 +550,10 @@
 			ENTRIES_CAPACITY_STEP;
 		new_entries = (struct cache_entry_ **)malloc(
 			sizeof(struct cache_entry_ *) * new_capacity);
-		assert(new_entries != NULL);
+		if (new_entries == NULL) {
+			TRACE_OUT(register_cache_entry);
+			return (-1);
+		}
 
 		memset(new_entries, 0, sizeof(struct cache_entry_ *) *
 		    new_capacity);
@@ -561,7 +571,10 @@
 	case CET_COMMON:
 		new_common_entry = (struct cache_common_entry_ *)malloc(
 			sizeof(struct cache_common_entry_));
-		assert(new_common_entry != NULL);
+		if (new_common_entry == NULL) {
+			TRACE_OUT(register_cache_entry);
+			return (-1);
+		}
 		memset(new_common_entry, 0, sizeof(struct cache_common_entry_));
 
 		memcpy(&new_common_entry->common_params, params,
@@ -570,8 +583,12 @@
 		  (struct cache_entry_params *)&new_common_entry->common_params;
 
 		new_common_entry->common_params.entry_name = (char *)malloc(
-			entry_name_size+1);
-		assert(new_common_entry->common_params.entry_name != NULL);
+			entry_name_size + 1);
+		if (new_common_entry->common_params.entry_name == NULL) {
+			free(new_common_entry);
+			TRACE_OUT(register_cache_entry);
+			return (-1);
+		}
 		memset(new_common_entry->common_params.entry_name, 0,
 			entry_name_size + 1);
 		strncpy(new_common_entry->common_params.entry_name,
@@ -582,6 +599,13 @@
 		HASHTABLE_INIT(&(new_common_entry->items),
 			struct cache_ht_item_data_, data,
 			new_common_entry->common_params.cache_entries_size);
+			
+		if (!HASHTABLE_OK(&(new_common_entry->items))) {
+			free(new_common_entry->common_params.entry_name);
+			free(new_common_entry);
+			TRACE_OUT(register_cache_entry);
+			return (-1);			
+		}
 
 		if (new_common_entry->common_params.policy == CPT_FIFO)
 			policies_size = 1;
@@ -590,27 +614,52 @@
 
 		new_common_entry->policies = (struct cache_policy_ **)malloc(
 			sizeof(struct cache_policy_ *) * policies_size);
-		assert(new_common_entry->policies != NULL);
+		if (new_common_entry->policies == NULL) {
+			HASHTABLE_DESTROY(&(new_common_entry->items), data);
+			free(new_common_entry->common_params.entry_name);
+			free(new_common_entry);
+			TRACE_OUT(register_cache_entry);
+			return (-1);				
+		}
 		memset(new_common_entry->policies, 0,
 			sizeof(struct cache_policy_ *) * policies_size);
 
 		new_common_entry->policies_size = policies_size;
 		new_common_entry->policies[0] = init_cache_fifo_policy();
 
-		if (policies_size > 1) {
+		if ((policies_size > 1) && 
+			(new_common_entry->policies[0] != NULL)) {
 			switch (new_common_entry->common_params.policy) {
 			case CPT_LRU:
 				new_common_entry->policies[1] =
 					init_cache_lru_policy();
+				if (new_common_entry->policies[1] == NULL) {
+					destroy_cache_fifo_policy(
+					    new_common_entry->policies[0]);
+					new_common_entry->policies[0] = NULL;
+				    }
 			break;
 			case CPT_LFU:
 				new_common_entry->policies[1] =
 					init_cache_lfu_policy();
+				if (new_common_entry->policies[1] == NULL) {
+					destroy_cache_fifo_policy(
+					    new_common_entry->policies[0]);
+					new_common_entry->policies[0] = NULL;
+				    }
 			break;
 			default:
 			break;
 			}
 		}
+		
+		if (new_common_entry->policies[0] == NULL) {
+			HASHTABLE_DESTROY(&(new_common_entry->items), data);
+			free(new_common_entry->common_params.entry_name);
+			free(new_common_entry);
+			TRACE_OUT(register_cache_entry);
+			return (-1);				
+		}
 
 		new_common_entry->get_time_func =
 			the_cache->params.get_time_func;
@@ -620,7 +669,10 @@
 	case CET_MULTIPART:
 		new_mp_entry = (struct cache_mp_entry_ *)malloc(
 			sizeof(struct cache_mp_entry_));
-		assert(new_mp_entry != NULL);
+		if (new_mp_entry == NULL) {
+			TRACE_OUT(register_cache_entry);
+			return (-1);
+		}
 		memset(new_mp_entry, 0, sizeof(struct cache_mp_entry_));
 
 		memcpy(&new_mp_entry->mp_params, params,
@@ -629,8 +681,12 @@
 			(struct cache_entry_params *)&new_mp_entry->mp_params;
 
 		new_mp_entry->mp_params.entry_name = (char *)malloc(
-			entry_name_size+1);
-		assert(new_mp_entry->mp_params.entry_name != NULL);
+			entry_name_size + 1);
+		if (new_mp_entry->mp_params.entry_name == NULL) {
+			free(new_mp_entry);
+			TRACE_OUT(register_cache_entry);
+			return (-1);
+		}
 		memset(new_mp_entry->mp_params.entry_name, 0,
 			entry_name_size + 1);
 		strncpy(new_mp_entry->mp_params.entry_name, params->entry_name,
@@ -844,15 +900,29 @@
 	}
 
 	item_data.key = (char *)malloc(key_size);
+	if (item_data.key == NULL) {
+		TRACE_OUT(cache_write);
+		return (-1);		
+	}
 	memcpy(item_data.key, key, key_size);
 
 	item_data.value = (char *)malloc(value_size);
-	assert(item_data.value != NULL);
+	if (item_data.value == NULL) {
+		free(item_data.key);
+		TRACE_OUT(cache_write);
+		return (-1);
+	}
 
 	memcpy(item_data.value, value, value_size);
 	item_data.value_size = value_size;
 
 	policy_item = common_entry->policies[0]->create_item_func();
+	if (policy_item == NULL) {
+		free(item_data.key);
+		free(item_data.value);
+		TRACE_OUT(cache_write);
+		return (-1);
+	}
 	policy_item->key = item_data.key;
 	policy_item->key_size = item_data.key_size;
 	common_entry->get_time_func(&policy_item->creation_time);
@@ -860,6 +930,14 @@
 	if (common_entry->policies_size > 1) {
 		connected_policy_item =
 			common_entry->policies[1]->create_item_func();
+		if (connected_policy_item == NULL) {
+			common_entry->policies[0]->destroy_item_func(
+				policy_item);
+			free(item_data.key);
+			free(item_data.value);
+			TRACE_OUT(cache_write);
+			return (-1);		
+		}
 		memcpy(&connected_policy_item->creation_time,
 			&policy_item->creation_time,
 			sizeof(struct timeval));
@@ -927,7 +1005,10 @@
 
 	retval = (struct cache_mp_write_session_ *)malloc(
 		sizeof(struct cache_mp_write_session_));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(open_cache_mp_write_session);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct cache_mp_write_session_));
 
 	TAILQ_INIT(&retval->items);
@@ -963,11 +1044,18 @@
 
 	new_item = (struct cache_mp_data_item_ *)malloc(
 		sizeof(struct cache_mp_data_item_));
-	assert(new_item != NULL);
+	if (new_item == NULL) {
+		TRACE_OUT(cache_mp_write);
+		return (-1);
+	}
 	memset(new_item, 0, sizeof(struct cache_mp_data_item_));
 
 	new_item->value = (char *)malloc(data_size);
-	assert(new_item->value != NULL);
+	if (new_item->value == NULL) {
+		free(new_item);
+		TRACE_OUT(cache_mp_write);
+		return (-1);
+	}
 	memcpy(new_item->value, data, data_size);
 	new_item->value_size = data_size;
 
@@ -1067,7 +1155,10 @@
 
 	retval = (struct cache_mp_read_session_ *)malloc(
 		sizeof(struct cache_mp_read_session_));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(open_cache_mp_read_session);
+		return (NULL);
+	}
 	memset(retval, 0, sizeof(struct cache_mp_read_session_));
 
 	retval->parent_entry = mp_entry;

==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cacheplcs.c#2 (text) ====

@@ -84,7 +84,10 @@
 	TRACE_IN(cache_queue_policy_create_item);
 	retval = (struct cache_queue_policy_item_ *)malloc(
 		sizeof(struct cache_queue_policy_item_));
-	assert(retval != NULL);
+	if (retval == NULL) {
+		TRACE_OUT(cache_queue_policy_create_item);

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list