Преглед изворни кода

Patch so realloc reverts to old buffer if reallocation fails.

git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@1170 fd59a12c-fef9-0310-b244-a6a79926bd2f
Steven Dake пре 19 година
родитељ
комит
6a00f63ff9
11 измењених фајлова са 75 додато и 35 уклоњено
  1. 3 2
      exec/aispoll.c
  2. 9 8
      exec/amfcomp.c
  3. 7 6
      exec/ckpt.c
  4. 3 2
      exec/cpg.c
  5. 3 3
      exec/evs.c
  6. 13 4
      exec/evt.c
  7. 16 4
      exec/mainconfig.c
  8. 16 3
      exec/totemip.c
  9. 1 1
      exec/totempg.c
  10. 2 1
      include/hdb.h
  11. 2 1
      lib/util.c

+ 3 - 2
exec/aispoll.c

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2003-2004 MontaVista Software, Inc.
+ * Copyright (c) 2006 Sun Microsystems, Inc.
  *
  * All rights reserved.
  *
@@ -170,7 +171,7 @@ int poll_dispatch_add (
 		poll_entries = (struct poll_entry *)realloc (poll_instance->poll_entries,
 			(poll_instance->poll_entry_count + 1) *
 			sizeof (struct poll_entry));
-		if (poll_entries == 0) {
+		if (poll_entries == NULL) {
 			res = -ENOMEM;
 			goto error_put;
 		}
@@ -179,7 +180,7 @@ int poll_dispatch_add (
 		ufds = (struct pollfd *)realloc (poll_instance->ufds,
 			(poll_instance->poll_entry_count + 1) *
 			sizeof (struct pollfd));
-		if (ufds == 0) {
+		if (ufds == NULL) {
 			res = -ENOMEM;
 			goto error_put;
 		}

+ 9 - 8
exec/amfcomp.c

@@ -1,19 +1,20 @@
 /** @file amfcomp.c
  * 
  * Copyright (c) 2002-2006 MontaVista Software, Inc.
+ * Copyright (c) 2006 Sun Microsystems, Inc.
+ * Copyright (c) 2006 Ericsson AB.
+ *
+ * All rights reserved.
+ *
  * Author: Steven Dake (sdake@mvista.com)
  *
- * Copyright (c) 2006 Ericsson AB.
- *  Author: Hans Feldt
+ * Author: Hans Feldt
  * - Introduced AMF B.02 information model
  * - Use DN in API and multicast messages
  * - (Re-)Introduction of event based multicast messages
  * - Refactoring of code into several AMF files
- *  Author: Anders Eriksson, Lars Holm
- *  - Component/SU restart, SU failover
- *
- * All rights reserved.
- *
+ * Author: Anders Eriksson, Lars Holm
+ * - Component/SU restart, SU failover
  *
  * This software licensed under BSD license, the text of which follows:
  * 
@@ -249,7 +250,7 @@ static int invocation_create (
 	if (invocation_addr == 0) {
 		invocation_temp = (struct invocation *)realloc (invocation_entries,
 			(invocation_entries_size + 1) * sizeof (struct invocation));
-		if (invocation_temp == 0) {
+		if (invocation_temp == NULL) {
 			return (-1);
 		}
 		invocation_entries = invocation_temp;

+ 7 - 6
exec/ckpt.c

@@ -2561,22 +2561,23 @@ static int recovery_section_create (
 		 */
 		if (section_descriptor->section_size
 			> checkpoint_section->section_descriptor.section_size) {
+			void *section_data_tmp;
 
 			log_printf (LOG_LEVEL_NOTICE,
 				"recovery_section_create reallocating data. Present Size: %d, New Size: %d\n",
 				(int)checkpoint_section->section_descriptor.section_size,
 				(int)section_descriptor->section_size);
 
-			checkpoint_section->section_data =
+			section_data_tmp =
 				realloc (checkpoint_section->section_data, section_descriptor->section_size);
-
-			if (checkpoint_section->section_data == 0) {
+			if (section_data_tmp == NULL) {
 				log_printf (LOG_LEVEL_ERROR,
-					"recovery_section_create section_data realloc returned 0 Calling error_exit.\n");
+					"recovery_section_create section_data realloc returned NULL Calling error_exit.\n");
 				error = SA_AIS_ERR_NO_MEMORY;
 				checkpoint_section_release(checkpoint_section);
 				goto error_exit;
 			}
+			checkpoint_section->section_data = section_data_tmp;
 
 			checkpoint_section->section_descriptor.section_size = section_descriptor->section_size;
 			error = SA_AIS_OK;
@@ -3107,8 +3108,8 @@ static void message_handler_req_exec_ckpt_sectionwrite (
 		req_exec_ckpt_sectionwrite->data_size;
 	if (size_required > checkpoint_section->section_descriptor.section_size) {
 		section_data = realloc (checkpoint_section->section_data, size_required);
-		if (section_data == 0) {
-			log_printf (LOG_LEVEL_ERROR, "section_data realloc returned 0 Calling error_exit.\n");
+		if (section_data == NULL) {
+			log_printf (LOG_LEVEL_ERROR, "section_data realloc returned NULL Calling error_exit.\n");
 			error = SA_AIS_ERR_NO_MEMORY;
 			goto error_exit;
 		}

+ 3 - 2
exec/cpg.c

@@ -546,8 +546,9 @@ static void remove_node_from_groups(
 
 						list_del(&gi->rg->list);
 						newsize = gi->rg->left_list_size * 2;
-						newrg = realloc(gi->rg, sizeof(struct removed_group) + newsize*sizeof(mar_cpg_address_t));
-						if (!newrg) {
+						newrg = realloc (gi->rg,
+							sizeof(struct removed_group) + newsize * sizeof(mar_cpg_address_t));
+						if (newrg == NULL) {
 							log_printf(LOG_LEVEL_CRIT, "Unable to realloc removed group struct. CPG callbacks will be junk.");
 							return;
 						}

+ 3 - 3
exec/evs.c

@@ -1,12 +1,12 @@
 /*
  * Copyright (c) 2004-2006 MontaVista Software, Inc.
  * Copyright (c) 2006 Red Hat, Inc.
- * Author: Steven Dake (sdake@mvista.com)
- *
  * Copyright (c) 2006 Sun Microsystems, Inc.
  *
  * All rights reserved.
  *
+ * Author: Steven Dake (sdake@mvista.com)
+ *
  * This software licensed under BSD license, the text of which follows:
  * 
  * Redistribution and use in source and binary forms, with or without
@@ -290,7 +290,7 @@ static void message_handler_req_evs_join (void *conn, void *msg)
 
 	addr = realloc (evs_pd->groups, sizeof (struct evs_group) * 
 		(evs_pd->group_entries + req_lib_evs_join->group_entries));
-	if (addr == 0) {
+	if (addr == NULL) {
 		error = SA_AIS_ERR_NO_MEMORY;
 		goto exit_error;
 	}

+ 13 - 4
exec/evt.c

@@ -1,7 +1,6 @@
 /*
  * Copyright (c) 2004-2006 Mark Haverkamp
  * Copyright (c) 2004-2006 Open Source Development Lab
- *
  * Copyright (c) 2006 Sun Microsystems, Inc.
  *
  * All rights reserved.
@@ -869,14 +868,17 @@ static struct event_svr_channel_instance *create_channel(mar_name_t *cn)
  */
 static int check_open_size(struct event_svr_channel_instance *eci)
 {
+	struct open_count *esc_node_opens_tmp;
+
 	if (total_member_count > eci->esc_oc_size) {
-		eci->esc_node_opens = realloc(eci->esc_node_opens,
+		esc_node_opens_tmp = realloc (eci->esc_node_opens,
 							sizeof(struct open_count) * total_member_count);
-		if (!eci->esc_node_opens) {
+		if (esc_node_opens_tmp == NULL) {
 			log_printf(LOG_LEVEL_WARNING,
 					"Memory error realloc of node list\n");
 			return -1;
 		}
+		eci->esc_node_opens = esc_node_opens_tmp;
 		memset(&eci->esc_node_opens[eci->esc_oc_size], 0,
 			sizeof(struct open_count) *
 					(total_member_count - eci->esc_oc_size));
@@ -1636,8 +1638,15 @@ evt_delivered(struct event_data *evt, struct event_svr_channel_open *eco)
 	log_printf(LOG_LEVEL_DEBUG, "delivered ID %llx to eco %p\n",
 			(unsigned long long)evt->ed_event.led_event_id, eco);
 	if (evt->ed_delivered_count == evt->ed_delivered_next) {
-		evt->ed_delivered = realloc(evt->ed_delivered,
+		struct event_svr_channel_open *ed_delivered_tmp;
+
+		ed_delivered_tmp = realloc (evt->ed_delivered,
 			DELIVER_SIZE * sizeof(struct event_svr_channel_open *));
+		if (ed_delivered_tmp == NULL) {
+			log_printf(LOG_LEVEL_WARNING, "Memory error realloc\n");
+			return;
+		}
+		evt->ed_delivered = ed_delivered_tmp;
 		memset(evt->ed_delivered + evt->ed_delivered_next, 0,
 			DELIVER_SIZE * sizeof(struct event_svr_channel_open *));
 		evt->ed_delivered_next = evt->ed_delivered_count;

+ 16 - 4
exec/mainconfig.c

@@ -204,10 +204,14 @@ int openais_main_config_read (
 									"logger",
 									strlen ("logger"),
 									&object_logger_handle) == 0) {
-			main_config->logger =
-				realloc(main_config->logger,
-						sizeof(struct logger_config) *
-						(main_config->loggers + 1));
+			struct logger_config *logger_tmp;
+			logger_tmp = realloc (main_config->logger,
+				sizeof(struct logger_config) * (main_config->loggers + 1));
+			if (logger_tmp == NULL) {
+				error_reason = "no more memory";
+				goto other_error;
+			}
+			main_config->logger = logger_tmp;
 			i = main_config->loggers;
 			main_config->loggers++;
 			memset(&main_config->logger[i], 0, sizeof(struct logger_config));
@@ -296,6 +300,14 @@ int openais_main_config_read (
 
 	return 0;
 
+other_error:
+	sprintf (error_string_response,
+		"error parsing config: %s.\n",
+		error_reason);
+
+	*error_string = error_string_response;
+	return -1;
+
 parse_error:
 	sprintf (error_string_response,
 		 "parse error in config: %s.\n",

+ 16 - 3
exec/totemip.c

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2005 Red Hat Inc
+ * Copyright (c) 2006 Sun Microsystems, Inc.
  *
  * All rights reserved.
  *
@@ -329,14 +330,24 @@ int totemip_iface_check(struct totem_ip_address *bindnet,
 	 * Generate list of local interfaces in ifc.ifc_req structure
 	 */
 	id_fd = socket (AF_INET, SOCK_DGRAM, 0);
-	ifc.ifc_buf = 0;
+	ifc.ifc_buf = NULL;
 	do {
+		void *ifc_buf_tmp;
 		numreqs += 32;
 		ifc.ifc_len = sizeof (struct ifreq) * numreqs;
-		ifc.ifc_buf = (void *)realloc(ifc.ifc_buf, ifc.ifc_len);
+		ifc_buf_tmp = realloc (ifc.ifc_buf, ifc.ifc_len);
+		if (ifc_buf_tmp == NULL) {
+			close (id_fd);
+			if (ifc.ifc_buf != NULL) {
+				free (ifc.ifc_buf);
+			}
+			return -1;
+		}
+		ifc.ifc_buf = ifc_buf_tmp;
 		res = ioctl (id_fd, SIOCGIFCONF, &ifc);
 		if (res < 0) {
 			close (id_fd);
+			free (ifc.ifc_buf);
 			return -1;
 		}
 	} while (ifc.ifc_len == sizeof (struct ifreq) * numreqs);
@@ -393,7 +404,9 @@ int totemip_iface_check(struct totem_ip_address *bindnet,
 			}
 		}
 	}
-	free (ifc.ifc_buf);
+	if (ifc.ifc_buf != NULL) {
+		free (ifc.ifc_buf);
+	}
 	close (id_fd);
 
 	return (res);

+ 1 - 1
exec/totempg.c

@@ -950,7 +950,7 @@ int totempg_groups_join (
 	new_groups = realloc (instance->groups,
 		sizeof (struct totempg_group) *
 		(instance->groups_cnt + group_cnt));
-	if (new_groups == 0) {
+	if (new_groups == NULL) {
 		res = ENOMEM;
 		goto error_exit;
 	}

+ 2 - 1
include/hdb.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2002-2006 MontaVista Software, Inc.
+ * Copyright (c) 2006 Sun Microsystems, Inc.
  *
  * All rights reserved.
  *
@@ -99,7 +100,7 @@ static inline int hdb_handle_create (
 		handle_database->handle_count += 1;
 		new_handles = (struct hdb_handle *)realloc (handle_database->handles,
 			sizeof (struct hdb_handle) * handle_database->handle_count);
-		if (new_handles == 0) {
+		if (new_handles == NULL) {
 			pthread_mutex_unlock (&handle_database->mutex);
 			return (-1);
 		}

+ 2 - 1
lib/util.c

@@ -2,6 +2,7 @@
  * vi: set autoindent tabstop=4 shiftwidth=4 :
  *
  * Copyright (c) 2002-2006 MontaVista Software, Inc.
+ * Copyright (c) 2006 Sun Microsystems, Inc.
  *
  * All rights reserved.
  *
@@ -532,7 +533,7 @@ saHandleCreate (
 		handleDatabase->handleCount += 1;
 		newHandles = (struct saHandle *)realloc (handleDatabase->handles,
 			sizeof (struct saHandle) * handleDatabase->handleCount);
-		if (newHandles == 0) {
+		if (newHandles == NULL) {
 			pthread_mutex_unlock (&handleDatabase->mutex);
 			return (SA_AIS_ERR_NO_MEMORY);
 		}