I have applied the attached patch to fix pg_upgrade file descriptor
leaks in error paths.

-- 
  Bruce Momjian  <br...@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c
index 9ef63ec..1c4847a 100644
*** a/contrib/pg_upgrade/check.c
--- b/contrib/pg_upgrade/check.c
*************** check_for_isn_and_int8_passing_mismatch(
*** 515,523 ****
  		PQfinish(conn);
  	}
  
  	if (found)
  	{
- 		fclose(script);
  		pg_log(PG_REPORT, "fatal\n");
  		pg_log(PG_FATAL,
  			   "| Your installation contains \"/contrib/isn\" functions\n"
--- 515,525 ----
  		PQfinish(conn);
  	}
  
+ 	if (script)
+ 			fclose(script);
+ 
  	if (found)
  	{
  		pg_log(PG_REPORT, "fatal\n");
  		pg_log(PG_FATAL,
  			   "| Your installation contains \"/contrib/isn\" functions\n"
*************** check_for_reg_data_type_usage(ClusterInf
*** 616,624 ****
  		PQfinish(conn);
  	}
  
  	if (found)
  	{
- 		fclose(script);
  		pg_log(PG_REPORT, "fatal\n");
  		pg_log(PG_FATAL,
  			   "| Your installation contains one of the reg* data types in\n"
--- 618,628 ----
  		PQfinish(conn);
  	}
  
+ 	if (script)
+ 		fclose(script);
+ 
  	if (found)
  	{
  		pg_log(PG_REPORT, "fatal\n");
  		pg_log(PG_FATAL,
  			   "| Your installation contains one of the reg* data types in\n"
diff --git a/contrib/pg_upgrade/file.c b/contrib/pg_upgrade/file.c
index deaca46..803e0a0 100644
*** a/contrib/pg_upgrade/file.c
--- b/contrib/pg_upgrade/file.c
*************** pg_scandir_internal(const char *dirname,
*** 302,308 ****
--- 302,311 ----
  						(size_t) ((name_num + 1) * sizeof(struct dirent *)));
  
  			if (*namelist == NULL)
+ 			{
+ 				closedir(dirdesc);
  				return -1;
+ 			}
  
  			entrysize = sizeof(struct dirent) - sizeof(direntry->d_name) +
  				strlen(direntry->d_name) + 1;
*************** pg_scandir_internal(const char *dirname,
*** 310,316 ****
--- 313,322 ----
  			(*namelist)[name_num] = (struct dirent *) malloc(entrysize);
  
  			if ((*namelist)[name_num] == NULL)
+ 			{
+ 				closedir(dirdesc);
  				return -1;
+ 			}
  
  			memcpy((*namelist)[name_num], direntry, entrysize);
  
diff --git a/contrib/pg_upgrade/server.c b/contrib/pg_upgrade/server.c
index c7684f8..84bd03e 100644
*** a/contrib/pg_upgrade/server.c
--- b/contrib/pg_upgrade/server.c
*************** get_major_server_version(ClusterInfo *cl
*** 144,154 ****
  	if (fscanf(version_fd, "%63s", cluster->major_version_str) == 0 ||
  		sscanf(cluster->major_version_str, "%d.%d", &integer_version,
  			   &fractional_version) != 2)
- 	{
  		pg_log(PG_FATAL, "could not get version from %s\n", datadir);
! 		fclose(version_fd);
! 		return 0;
! 	}
  
  	return (100 * integer_version + fractional_version) * 100;
  }
--- 144,152 ----
  	if (fscanf(version_fd, "%63s", cluster->major_version_str) == 0 ||
  		sscanf(cluster->major_version_str, "%d.%d", &integer_version,
  			   &fractional_version) != 2)
  		pg_log(PG_FATAL, "could not get version from %s\n", datadir);
! 
! 	fclose(version_fd);
  
  	return (100 * integer_version + fractional_version) * 100;
  }
diff --git a/contrib/pg_upgrade/version.c b/contrib/pg_upgrade/version.c
index e321538..8ba7e98 100644
*** a/contrib/pg_upgrade/version.c
--- b/contrib/pg_upgrade/version.c
*************** new_9_0_populate_pg_largeobject_metadata
*** 62,71 ****
  		PQfinish(conn);
  	}
  
  	if (found)
  	{
- 		if (!check_mode)
- 			fclose(script);
  		report_status(PG_WARNING, "warning");
  		if (check_mode)
  			pg_log(PG_WARNING, "\n"
--- 62,72 ----
  		PQfinish(conn);
  	}
  
+ 	if (script)
+ 		fclose(script);
+ 
  	if (found)
  	{
  		report_status(PG_WARNING, "warning");
  		if (check_mode)
  			pg_log(PG_WARNING, "\n"
diff --git a/contrib/pg_upgrade/version_old_8_3.c b/contrib/pg_upgrade/version_old_8_3.c
index 5b226b2..3ec4b59 100644
*** a/contrib/pg_upgrade/version_old_8_3.c
--- b/contrib/pg_upgrade/version_old_8_3.c
*************** old_8_3_check_for_name_data_type_usage(C
*** 87,95 ****
  		PQfinish(conn);
  	}
  
  	if (found)
  	{
- 		fclose(script);
  		pg_log(PG_REPORT, "fatal\n");
  		pg_log(PG_FATAL,
  			   "| Your installation contains the \"name\" data type in\n"
--- 87,97 ----
  		PQfinish(conn);
  	}
  
+ 	if (script)
+ 		fclose(script);
+ 
  	if (found)
  	{
  		pg_log(PG_REPORT, "fatal\n");
  		pg_log(PG_FATAL,
  			   "| Your installation contains the \"name\" data type in\n"
*************** old_8_3_check_for_tsquery_usage(ClusterI
*** 175,183 ****
  		PQfinish(conn);
  	}
  
  	if (found)
  	{
- 		fclose(script);
  		pg_log(PG_REPORT, "fatal\n");
  		pg_log(PG_FATAL,
  			   "| Your installation contains the \"tsquery\" data type.\n"
--- 177,187 ----
  		PQfinish(conn);
  	}
  
+ 	if (script)
+ 		fclose(script);
+ 
  	if (found)
  	{
  		pg_log(PG_REPORT, "fatal\n");
  		pg_log(PG_FATAL,
  			   "| Your installation contains the \"tsquery\" data type.\n"
*************** old_8_3_rebuild_tsvector_tables(ClusterI
*** 314,323 ****
  		PQfinish(conn);
  	}
  
  	if (found)
  	{
- 		if (!check_mode)
- 			fclose(script);
  		report_status(PG_WARNING, "warning");
  		if (check_mode)
  			pg_log(PG_WARNING, "\n"
--- 318,328 ----
  		PQfinish(conn);
  	}
  
+ 	if (script)
+ 		fclose(script);
+ 
  	if (found)
  	{
  		report_status(PG_WARNING, "warning");
  		if (check_mode)
  			pg_log(PG_WARNING, "\n"
*************** old_8_3_invalidate_hash_gin_indexes(Clus
*** 424,433 ****
  		PQfinish(conn);
  	}
  
  	if (found)
  	{
- 		if (!check_mode)
- 			fclose(script);
  		report_status(PG_WARNING, "warning");
  		if (check_mode)
  			pg_log(PG_WARNING, "\n"
--- 429,439 ----
  		PQfinish(conn);
  	}
  
+ 	if (script)
+ 		fclose(script);
+ 
  	if (found)
  	{
  		report_status(PG_WARNING, "warning");
  		if (check_mode)
  			pg_log(PG_WARNING, "\n"
*************** old_8_3_invalidate_bpchar_pattern_ops_in
*** 553,562 ****
  		PQfinish(conn);
  	}
  
  	if (found)
  	{
- 		if (!check_mode)
- 			fclose(script);
  		report_status(PG_WARNING, "warning");
  		if (check_mode)
  			pg_log(PG_WARNING, "\n"
--- 559,569 ----
  		PQfinish(conn);
  	}
  
+ 	if (script)
+ 		fclose(script);
+ 
  	if (found)
  	{
  		report_status(PG_WARNING, "warning");
  		if (check_mode)
  			pg_log(PG_WARNING, "\n"
*************** old_8_3_create_sequence_script(ClusterIn
*** 672,678 ****
  
  		PQfinish(conn);
  	}
! 	if (found)
  		fclose(script);
  
  	check_ok();
--- 679,686 ----
  
  		PQfinish(conn);
  	}
! 
! 	if (script)
  		fclose(script);
  
  	check_ok();
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to