Fix file descriptor leaks in pg_upgrade in failure code paths.
authorBruce Momjian <[email protected]>
Wed, 9 Mar 2011 02:35:42 +0000 (21:35 -0500)
committerBruce Momjian <[email protected]>
Wed, 9 Mar 2011 02:36:17 +0000 (21:36 -0500)
contrib/pg_upgrade/check.c
contrib/pg_upgrade/file.c
contrib/pg_upgrade/server.c
contrib/pg_upgrade/version.c
contrib/pg_upgrade/version_old_8_3.c

index 9ef63ec2c9dc802e85efb3c72a5b6d9749eabad9..1c4847abea1b3b0bf9488db00df722a457b50c8c 100644 (file)
@@ -515,9 +515,11 @@ check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster)
        PQfinish(conn);
    }
 
+   if (script)
+           fclose(script);
+
    if (found)
    {
-       fclose(script);
        pg_log(PG_REPORT, "fatal\n");
        pg_log(PG_FATAL,
               "| Your installation contains \"/contrib/isn\" functions\n"
@@ -616,9 +618,11 @@ check_for_reg_data_type_usage(ClusterInfo *cluster)
        PQfinish(conn);
    }
 
+   if (script)
+       fclose(script);
+
    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"
index deaca4698b7e45c0878204ea5008e4a27060dcb5..803e0a0f70f3b6b3c37be69187d476693a144a94 100644 (file)
@@ -302,7 +302,10 @@ pg_scandir_internal(const char *dirname,
                        (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;
@@ -310,7 +313,10 @@ pg_scandir_internal(const char *dirname,
            (*namelist)[name_num] = (struct dirent *) malloc(entrysize);
 
            if ((*namelist)[name_num] == NULL)
+           {
+               closedir(dirdesc);
                return -1;
+           }
 
            memcpy((*namelist)[name_num], direntry, entrysize);
 
index c7684f87e5e1d607cd2e4b43d87f5e8dcda347b7..84bd03ed8ed55d564c1be6d3f7d8b06e8ffbc87a 100644 (file)
@@ -144,11 +144,9 @@ get_major_server_version(ClusterInfo *cluster)
    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;
-   }
+
+   fclose(version_fd);
 
    return (100 * integer_version + fractional_version) * 100;
 }
index e32153818af4ac659715a996b5b20e58b4bf540c..8ba7e98d922990e8af59c6249a22c5bd74926d47 100644 (file)
@@ -62,10 +62,11 @@ new_9_0_populate_pg_largeobject_metadata(ClusterInfo *cluster, bool check_mode)
        PQfinish(conn);
    }
 
+   if (script)
+       fclose(script);
+
    if (found)
    {
-       if (!check_mode)
-           fclose(script);
        report_status(PG_WARNING, "warning");
        if (check_mode)
            pg_log(PG_WARNING, "\n"
index 5b226b218df1d3efc12dc0c22b434f0ad58c9f22..3ec4b59a05e17a24b19ecbbe786af7b12681529a 100644 (file)
@@ -87,9 +87,11 @@ old_8_3_check_for_name_data_type_usage(ClusterInfo *cluster)
        PQfinish(conn);
    }
 
+   if (script)
+       fclose(script);
+
    if (found)
    {
-       fclose(script);
        pg_log(PG_REPORT, "fatal\n");
        pg_log(PG_FATAL,
               "| Your installation contains the \"name\" data type in\n"
@@ -175,9 +177,11 @@ old_8_3_check_for_tsquery_usage(ClusterInfo *cluster)
        PQfinish(conn);
    }
 
+   if (script)
+       fclose(script);
+
    if (found)
    {
-       fclose(script);
        pg_log(PG_REPORT, "fatal\n");
        pg_log(PG_FATAL,
               "| Your installation contains the \"tsquery\" data type.\n"
@@ -314,10 +318,11 @@ old_8_3_rebuild_tsvector_tables(ClusterInfo *cluster, bool check_mode)
        PQfinish(conn);
    }
 
+   if (script)
+       fclose(script);
+
    if (found)
    {
-       if (!check_mode)
-           fclose(script);
        report_status(PG_WARNING, "warning");
        if (check_mode)
            pg_log(PG_WARNING, "\n"
@@ -424,10 +429,11 @@ old_8_3_invalidate_hash_gin_indexes(ClusterInfo *cluster, bool check_mode)
        PQfinish(conn);
    }
 
+   if (script)
+       fclose(script);
+
    if (found)
    {
-       if (!check_mode)
-           fclose(script);
        report_status(PG_WARNING, "warning");
        if (check_mode)
            pg_log(PG_WARNING, "\n"
@@ -553,10 +559,11 @@ old_8_3_invalidate_bpchar_pattern_ops_indexes(ClusterInfo *cluster,
        PQfinish(conn);
    }
 
+   if (script)
+       fclose(script);
+
    if (found)
    {
-       if (!check_mode)
-           fclose(script);
        report_status(PG_WARNING, "warning");
        if (check_mode)
            pg_log(PG_WARNING, "\n"
@@ -672,7 +679,8 @@ old_8_3_create_sequence_script(ClusterInfo *cluster)
 
        PQfinish(conn);
    }
-   if (found)
+
+   if (script)
        fclose(script);
 
    check_ok();