postgres.git / summary / log / commit / refs

commit    c0f279c469c87a010fda19647c5453baa5ba97ee
Author:   Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date:     Fri Dec 05 11:08:22 2014 +0000
First released in: 9.5.0

    Don't include file type bits in tar archive's mode field.
    
    The "file mode" bits in the tar file header is not supposed to include the
    file type bits, e.g. S_IFREG or S_IFDIR. The file type is stored in a
    separate field. This isn't a problem in practice, all tar programs ignore
    the extra bits, but let's be tidy.
    
    This came up in a discussion around bug #11949, reported by Hendrik Grewe,
    although this doesn't fix the issue with tar --append. That turned out to be
    a bug in GNU tar. Schilly's tartest program revealed this defect in the tar
    created by pg_basebackup.
    
    This problem goes as far as we we've had pg_basebackup, but since this
    hasn't caused any problems in practice, let's be conservative and fix in
    master only.


src/port/tar.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/port/tar.c b/src/port/tar.c index 09fd6c10d34..8ef4f9c3883 100644 --- a/src/port/tar.c +++ b/src/port/tar.c @@ -77,8 +77,8 @@ tarCreateHeader(char *h, const char *filename, const char *linktarget, h[flen + 1] = '\0'; } - /* Mode 8 */ - sprintf(&h[100], "%07o ", (int) mode); + /* Mode 8 - this doesn't include the file type bits (S_IFMT) */ + sprintf(&h[100], "%07o ", (int) (mode & 07777)); /* User ID 8 */ sprintf(&h[108], "%07o ", (int) uid); [parent: b27b6e75af55]