]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix pg_restore to guard against unexpected EOF while reading an archive file.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 6 Aug 2007 01:38:57 +0000 (01:38 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 6 Aug 2007 01:38:57 +0000 (01:38 +0000)
Per report and partial patch from Chad Wagner.

src/bin/pg_dump/pg_backup_archiver.c
src/bin/pg_dump/pg_backup_custom.c
src/bin/pg_dump/pg_backup_files.c
src/bin/pg_dump/pg_backup_tar.c

index 474938dece75a464583a16cd0555b0a1c0499513..3a9437e444c4d76e7786ab79faaee027de03ff51 100644 (file)
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *             $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.62.2.7 2005/05/17 17:31:15 tgl Exp $
+ *             $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.62.2.8 2007/08/06 01:38:57 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1545,7 +1545,7 @@ ReadStr(ArchiveHandle *AH)
        int                     l;
 
        l = ReadInt(AH);
-       if (l == -1)
+       if (l < 0)
                buf = NULL;
        else
        {
@@ -1553,7 +1553,9 @@ ReadStr(ArchiveHandle *AH)
                if (!buf)
                        die_horribly(AH, modulename, "out of memory\n");
 
-               (*AH->ReadBufPtr) (AH, (void *) buf, l);
+               if ((*AH->ReadBufPtr) (AH, (void *) buf, l) != l)
+                       die_horribly(AH, modulename, "unexpected end of file\n");
+
                buf[l] = '\0';
        }
 
@@ -2277,8 +2279,8 @@ ReadHead(ArchiveHandle *AH)
        /* If we haven't already read the header... */
        if (!AH->readHeader)
        {
-
-               (*AH->ReadBufPtr) (AH, tmpMag, 5);
+               if ((*AH->ReadBufPtr) (AH, tmpMag, 5) != 5)
+                       die_horribly(AH, modulename, "unexpected end of file\n");
 
                if (strncmp(tmpMag, "PGDMP", 5) != 0)
                        die_horribly(AH, modulename, "did not find magic string in file header\n");
index c2fcef7536e7f7d08eff8115ac51a3b86a268a44..a15a04aa3abf4205b4867da45434ebe3f226f4e0 100644 (file)
@@ -19,7 +19,7 @@
  *
  *
  * IDENTIFICATION
- *             $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_custom.c,v 1.23 2002/10/25 01:33:17 momjian Exp $
+ *             $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_custom.c,v 1.23.2.1 2007/08/06 01:38:57 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -713,7 +713,7 @@ _WriteByte(ArchiveHandle *AH, const int i)
  *
  * Called by the archiver to read bytes & integers from the archive.
  * These routines are only used to read & write headers & TOC.
- *
+ * EOF should be treated as a fatal error.
  */
 static int
 _ReadByte(ArchiveHandle *AH)
@@ -721,9 +721,10 @@ _ReadByte(ArchiveHandle *AH)
        lclContext *ctx = (lclContext *) AH->formatData;
        int                     res;
 
-       res = fgetc(AH->FH);
-       if (res != EOF)
-               ctx->filePos += 1;
+       res = getc(AH->FH);
+       if (res == EOF)
+               die_horribly(AH, modulename, "unexpected end of file\n");
+       ctx->filePos += 1;
        return res;
 }
 
index 3a4914828a58e3e79b2ff2acd5eb531e3387eaa2..f9a9264205cc988f45f8f4cbd73859ec132e4b62 100644 (file)
@@ -20,7 +20,7 @@
  *
  *
  * IDENTIFICATION
- *             $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_files.c,v 1.21 2002/10/25 01:33:17 momjian Exp $
+ *             $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_files.c,v 1.21.2.1 2007/08/06 01:38:57 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -396,9 +396,10 @@ _ReadByte(ArchiveHandle *AH)
        lclContext *ctx = (lclContext *) AH->formatData;
        int                     res;
 
-       res = fgetc(AH->FH);
-       if (res != EOF)
-               ctx->filePos += 1;
+       res = getc(AH->FH);
+       if (res == EOF)
+               die_horribly(AH, modulename, "unexpected end of file\n");
+       ctx->filePos += 1;
        return res;
 }
 
index 93293fe8058ba3d2db4be222a5d6bc9a9c998c0b..2f8169f85356542dfb4b410e3526cc5774158efd 100644 (file)
@@ -16,7 +16,7 @@
  *
  *
  * IDENTIFICATION
- *             $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.32.2.2 2003/02/01 19:29:26 tgl Exp $
+ *             $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.32.2.3 2007/08/06 01:38:57 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -484,7 +484,7 @@ _tarReadRaw(ArchiveHandle *AH, void *buf, size_t len, TAR_MEMBER *th, FILE *fh)
                        used = avail;
 
                /* Copy, and adjust buffer pos */
-               memcpy(buf, AH->lookahead, used);
+               memcpy(buf, AH->lookahead + AH->lookaheadPos, used);
                AH->lookaheadPos += used;
 
                /* Adjust required length */
@@ -728,12 +728,13 @@ static int
 _ReadByte(ArchiveHandle *AH)
 {
        lclContext *ctx = (lclContext *) AH->formatData;
-       int                     res;
-       char            c = '\0';
+       size_t          res;
+       unsigned char c;
 
        res = tarRead(&c, 1, ctx->FH);
-       if (res != EOF)
-               ctx->filePos += res;
+       if (res != 1)
+               die_horribly(AH, modulename, "unexpected end of file\n");
+       ctx->filePos += 1;
        return c;
 }