postgres.git / summary / log / commit / refs

commit    5ba26d48fc03eef2083768672548bde0bb6ddbbe
Author:   Neil Conway <neilc@samurai.com>
Date:     Wed Jun 22 02:02:09 2005 +0000
First released in: 8.1.0, 7.4.9, 8.0.4

    Correct some code in pg_restore when reading the header of a tar archive:
    
    (1) The code doesn't initialize `sum', so the initial "does the checksum
        match?" test is wrong.
    
    (2) The loop that is intended to check for a "null block" just checks
        the first byte of the tar block 512 times, rather than each of the
        512 bytes one time (!), which I'm guessing was the intent.
    
    It was only through sheer luck that this worked in the first place.
    
    Per Coverity static analysis performed by EnterpriseDB.


src/bin/pg_dump/pg_backup_tar.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c index c13ae903c0c..adb5eba895b 100644 --- a/src/bin/pg_dump/pg_backup_tar.c +++ b/src/bin/pg_dump/pg_backup_tar.c @@ -16,7 +16,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.46.4.1 2005/01/25 22:44:47 tgl Exp $ + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.46.4.2 2005/06/22 02:02:09 neilc Exp $ * *------------------------------------------------------------------------- */ @@ -1155,7 +1155,6 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th) size_t len; unsigned long ullen; off_t hPos; - int i; bool gotBlock = false; while (!gotBlock) @@ -1178,7 +1177,7 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th) hPos = ctx->tarFHpos; /* Read a 512 byte block, return EOF, exit if short */ - len = _tarReadRaw(AH, &h[0], 512, NULL, ctx->tarFH); + len = _tarReadRaw(AH, h, 512, NULL, ctx->tarFH); if (len == 0) /* EOF */ return 0; @@ -1188,20 +1187,22 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th) (unsigned long) len); /* Calc checksum */ - chk = _tarChecksum(&h[0]); + chk = _tarChecksum(h); + sscanf(&h[148], "%8o", &sum); /* - * If the checksum failed, see if it is a null block. If so, then - * just try with next block... + * If the checksum failed, see if it is a null block. If so, + * silently continue to the next block. */ - if (chk == sum) gotBlock = true; else { + int i; + for (i = 0; i < 512; i++) { - if (h[0] != 0) + if (h[i] != 0) { gotBlock = true; break; @@ -1213,7 +1214,6 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th) sscanf(&h[0], "%99s", tag); sscanf(&h[124], "%12lo", &ullen); len = (size_t) ullen; - sscanf(&h[148], "%8o", &sum); { char buf[100]; [parent: 5bcb851c92ae]