From owner-p4-projects@FreeBSD.ORG Wed Aug 9 17:17:00 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 1B95016A4E0; Wed, 9 Aug 2006 17:17:00 +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 D38DF16A4DD for ; Wed, 9 Aug 2006 17:16:59 +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 4626B43D5D for ; Wed, 9 Aug 2006 17:16:59 +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 k79HGwNo080599 for ; Wed, 9 Aug 2006 17:16:59 GMT (envelope-from bushman@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k79HGw9Y080596 for perforce@freebsd.org; Wed, 9 Aug 2006 17:16:58 GMT (envelope-from bushman@freebsd.org) Date: Wed, 9 Aug 2006 17:16:58 GMT Message-Id: <200608091716.k79HGw9Y080596@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 103515 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 17:17:00 -0000 http://perforce.freebsd.org/chv.cgi?CH=103515 Change 103515 by bushman@bushman_nss_ldap_cached on 2006/08/09 17:16:25 Some memory errors handling issues fixed. Affected files ... .. //depot/projects/soc2006/nss_ldap_cached/src/lib/libc/net/nscache.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/libc/net/nscachedcli.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/libc/net/nsdispatch.c#6 edit Differences ... ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/libc/net/nscache.c#2 (text) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2005 Michael Bushkov + * Copyright (c) 2005 Michael Bushkov * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -71,6 +71,10 @@ params.socket_path = CACHED_SOCKET_PATH; cache_data->key = (char *)malloc(NSS_CACHE_KEY_INITIAL_SIZE); + if (cache_data->key == NULL) { + cache_data->key_size = 0; + return (NS_UNAVAIL); + } memset(cache_data->key, 0, NSS_CACHE_KEY_INITIAL_SIZE); cache_data->key_size = NSS_CACHE_KEY_INITIAL_SIZE; va_copy(ap_new, ap); @@ -85,8 +89,12 @@ break; cache_data->key_size <<= 1; - cache_data->key = realloc(cache_data->key, + cache_data->key = reallocf(cache_data->key, cache_data->key_size); + if (cache_data->key == NULL) { + res = NS_UNAVAIL; + break; + } memset(cache_data->key, 0, cache_data->key_size); va_copy(ap_new, ap); } @@ -102,6 +110,8 @@ buffer_size = NSS_CACHE_BUFFER_INITIAL_SIZE; buffer = (char *)malloc(NSS_CACHE_BUFFER_INITIAL_SIZE); + if (buffer == NULL) + return (NS_UNAVAIL); memset(buffer, 0, NSS_CACHE_BUFFER_INITIAL_SIZE); do { @@ -115,7 +125,9 @@ &buffer_size); __close_cached_connection(connection); if (res == -2 && buffer_size < NSS_CACHE_BUFFER_SIZE_LIMIT) { - buffer = (char *)realloc(buffer, buffer_size); + buffer = (char *)reallocf(buffer, buffer_size); + if (buffer == NULL) + return (NS_UNAVAIL); memset(buffer, 0, buffer_size); } } while (res == -2); @@ -185,6 +197,11 @@ buffer_size = NSS_CACHE_BUFFER_INITIAL_SIZE; buffer = (char *)malloc(NSS_CACHE_BUFFER_INITIAL_SIZE); + if (buffer == NULL) { + __close_cached_connection(connection); + free(cache_data->key); + return (NS_UNAVAIL); + } memset(buffer, 0, NSS_CACHE_BUFFER_INITIAL_SIZE); do { @@ -201,7 +218,11 @@ break; buffer_size <<= 1; - buffer = (char *)realloc(buffer, buffer_size); + buffer = (char *)reallocf(buffer, buffer_size); + if (buffer == NULL) { + res = NS_UNAVAIL; + break; + } memset(buffer, 0, buffer_size); } } while (res == NS_RETURN); @@ -291,12 +312,22 @@ buffer_size = NSS_CACHE_BUFFER_INITIAL_SIZE; buffer = (char *)malloc(NSS_CACHE_BUFFER_INITIAL_SIZE); + if (buffer == NULL) { + __close_cached_mp_read_session(rs); + rs = INVALID_CACHED_MP_READ_SESSION; + cache_info->set_mp_rs_func(rs); + return (NS_UNAVAIL); + } memset(buffer, 0, NSS_CACHE_BUFFER_INITIAL_SIZE); do { res = __cached_mp_read(rs, buffer, &buffer_size); if (res == -2 && buffer_size < NSS_CACHE_BUFFER_SIZE_LIMIT) { - buffer = (char *)realloc(buffer, buffer_size); + buffer = (char *)reallocf(buffer, buffer_size); + if (buffer == NULL) { + res = -1; + break; + } memset(buffer, 0, buffer_size); } } while (res == -2); @@ -341,6 +372,12 @@ cache_data = (nss_cache_data *)mdata; cache_info = cache_data->info; + buffer_size = NSS_CACHE_BUFFER_INITIAL_SIZE; + buffer = (char *)malloc(NSS_CACHE_BUFFER_INITIAL_SIZE); + if (buffer == NULL) + return (NS_UNAVAIL); + memset(buffer, 0, NSS_CACHE_BUFFER_INITIAL_SIZE); + ws = cache_info->get_mp_ws_func(); if (ws == INVALID_CACHED_MP_WRITE_SESSION) { memset(¶ms, 0, sizeof(struct cached_connection_params)); @@ -354,10 +391,6 @@ cache_info->set_mp_ws_func(ws); } - buffer_size = NSS_CACHE_BUFFER_INITIAL_SIZE; - buffer = (char *)malloc(NSS_CACHE_BUFFER_INITIAL_SIZE); - memset(buffer, 0, NSS_CACHE_BUFFER_INITIAL_SIZE); - do { size_t size; @@ -372,7 +405,11 @@ break; buffer_size <<= 1; - buffer = (char *)realloc(buffer, buffer_size); + buffer = (char *)reallocf(buffer, buffer_size); + if (buffer == NULL) { + res = NS_UNAVAIL; + break; + } memset(buffer, 0, buffer_size); } } while (res == NS_RETURN); ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/libc/net/nscachedcli.c#2 (text) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2005 Michael Bushkov + * Copyright (c) 2005 Michael Bushkov * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -215,19 +215,31 @@ _fcntl(client_socket, F_SETFL, O_NONBLOCK); retval = malloc(sizeof(struct cached_connection_)); - assert(retval != NULL); + if (retval == NULL) { + _close(client_socket); + 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(client_socket); + free(retval); + 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(client_socket); + _close(retval->write_queue); + free(retval); + return (NULL); + } EV_SET(&eventlist, retval->sockfd, EVFILT_READ, EV_ADD, 0, 0, NULL); res = kevent(retval->read_queue, &eventlist, 1, NULL, 0, NULL); ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/libc/net/nsdispatch.c#6 (text+ko) ==== @@ -707,7 +707,8 @@ __nss_common_cache_write_negative(cache_data_p); } va_end(ap); - } + } else if (cache_data_p != NULL) + free(cache_data.key); #endif /* NS_CACHING */ if (isthreaded)