Prevent file descriptor leak from failed COPY.
authorBruce Momjian
Sat, 29 Aug 1998 18:19:59 +0000 (18:19 +0000)
committerBruce Momjian
Sat, 29 Aug 1998 18:19:59 +0000 (18:19 +0000)
src/backend/commands/copy.c

index 070be8861c25537df8dda31cf97a630d5e125125..fa016c7353d2846519606486aa4362005b0dcc6c 100644 (file)
@@ -6,7 +6,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.56 1998/08/29 05:27:15 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.57 1998/08/29 18:19:59 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -108,12 +108,21 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
   the class.
 ----------------------------------------------------------------------------*/
 
-   FILE       *fp;
+   static FILE    *fp;                     /* static for cleanup */
+   static bool     file_opened = false;    /* static for cleanup */
    Relation    rel;
    extern char *UserName;      /* defined in global.c */
    const AclMode required_access = from ? ACL_WR : ACL_RD;
    int         result;
 
+   /*
+    *  Close previous file opened for COPY but failed with elog().
+    *  There should be a better way, but would not be modular.
+    *  Prevents file descriptor leak.  bjm 1998/08/29
+    */
+   if (file_opened)
+       FreeFile(fp);
+
    rel = heap_openr(relname);
    if (rel == NULL)
        elog(ERROR, "COPY command failed.  Class %s "
@@ -146,14 +155,13 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
            }
            else
            {
-               /* if we elog() out, the file stays open */
                fp = AllocateFile(filename, "r");
                if (fp == NULL)
                    elog(ERROR, "COPY command, running in backend with "
                         "effective uid %d, could not open file '%s' for "
                         "reading.  Errno = %s (%d).",
                         geteuid(), filename, strerror(errno), errno);
-               /* Above should not return */
+               file_opened = true;
            }
            CopyFrom(rel, binary, oids, fp, delim);
        }
@@ -174,7 +182,6 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
                mode_t      oumask;     /* Pre-existing umask value */
 
                oumask = umask((mode_t) 0);
-               /* if we elog() out, the file stays open */
                fp = AllocateFile(filename, "w");
                umask(oumask);
                if (fp == NULL)
@@ -182,12 +189,15 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
                         "effective uid %d, could not open file '%s' for "
                         "writing.  Errno = %s (%d).",
                         geteuid(), filename, strerror(errno), errno);
-               /* Above should not return */
+               file_opened = true;
            }
            CopyTo(rel, binary, oids, fp, delim);
        }
        if (!pipe)
+       {
            FreeFile(fp);
+           file_opened = false;
+       }
        else if (!from && !binary)
        {
            fputs("\\.\n", fp);