]> granicus.if.org Git - postgresql/commitdiff
Don't include file type bits in tar archive's mode field.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 5 Dec 2014 11:08:22 +0000 (13:08 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 5 Dec 2014 11:54:21 +0000 (13:54 +0200)
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

index 09fd6c10d34e0c576b8fadc1dc06cd3656db5249..8ef4f9c3883099f0ad4f8349cfdedaa42e919a69 100644 (file)
@@ -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);