From owner-p4-projects@FreeBSD.ORG Wed Aug 9 16:34:05 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 0960316A4E7; Wed, 9 Aug 2006 16:34:05 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id D8BDC16A4E0 for ; Wed, 9 Aug 2006 16:34:04 +0000 (UTC) (envelope-from bushman@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 8574143D49 for ; Wed, 9 Aug 2006 16:34:04 +0000 (GMT) (envelope-from bushman@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k79GY4lF069470 for ; Wed, 9 Aug 2006 16:34:04 GMT (envelope-from bushman@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k79GY4Jv069467 for perforce@freebsd.org; Wed, 9 Aug 2006 16:34:04 GMT (envelope-from bushman@freebsd.org) Date: Wed, 9 Aug 2006 16:34:04 GMT Message-Id: <200608091634.k79GY4Jv069467@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to bushman@freebsd.org using -f From: Michael Bushkov To: Perforce Change Reviews Cc: Subject: PERFORCE change 103514 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 09 Aug 2006 16:34:05 -0000 http://perforce.freebsd.org/chv.cgi?CH=103514 Change 103514 by bushman@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) <<<