Fix for pg_upgrade discriptor leaks - Mailing list pgsql-hackers
From | Bruce Momjian |
---|---|
Subject | Fix for pg_upgrade discriptor leaks |
Date | |
Msg-id | 201103090236.p292aFR06570@momjian.us Whole thread Raw |
Responses |
Re: Fix for pg_upgrade discriptor leaks
|
List | pgsql-hackers |
I have applied the attached patch to fix pg_upgrade file descriptor leaks in error paths. -- Bruce Momjian <bruce@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();
pgsql-hackers by date: