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