archive: honor tar.umask even for pax headers
git archive's tar format uses extended pax headers to encode metadata into the archive. Most tar implementations correctly treat these as metadata, but some that do not understand the pax format extract these as files instead. Apply the tar.umask setting to these entries to prevent tampering by other users. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
brian m. carlson committed
Aug 3, 2014 at 03:02 UTC
10f343ea814f5c18a0913997904ee11cd9b7da24
2 files changed
+7
-2
archive-tar.c
+2
-2
@@ -192,7 +192,7 @@ static int write_extended_header(struct archiver_args *args,
192
unsigned int mode;
193
memset(&header, 0, sizeof(header));
194
*header.typeflag = TYPEFLAG_EXT_HEADER;
195
- mode = 0100666;
195
+ mode = 0100666 & ~tar_umask;
196
sprintf(header.name, "%s.paxheader", sha1_to_hex(sha1));
197
prepare_header(args, &header, mode, size);
198
write_blocked(&header, sizeof(header));
@@ -300,7 +300,7 @@ static int write_global_extended_header(struct archiver_args *args)
300
strbuf_append_ext_header(&ext_header, "comment", sha1_to_hex(sha1), 40);
301
memset(&header, 0, sizeof(header));
302
*header.typeflag = TYPEFLAG_GLOBAL_HEADER;
303
- mode = 0100666;
303
+ mode = 0100666 & ~tar_umask;
304
strcpy(header.name, "pax_global_header");
305
prepare_header(args, &header, mode, ext_header.len);
306
write_blocked(&header, sizeof(header));
t/t5004-archive-corner-cases.sh
+5
@@ -113,4 +113,9 @@ test_expect_success 'archive empty subtree by direct pathspec' '
113
check_dir extract sub
114
'
115
116
+test_expect_success 'archive applies umask even for pax headers' '
117
+ git archive --format=tar HEAD >archive.tar &&
118
+ ! grep 0666 archive.tar
119
+'
120
+
121
test_done