Skip to content

Commit 66b5a2f

Browse files
Lars Jeppesendsnet
authored andcommitted
archive/tar: remove file type bits from mode field
When writing tar files by using the FileInfoHeader the type bits was set in the mode field of the header This is not correct according to the standard (GNU/Posix) and other implementations. Fixed #20150 Change-Id: I3be7d946a1923ad5827cf45c696546a5e287ebba Reviewed-on: https://go-review.googlesource.com/42093 Reviewed-by: Joe Tsai <[email protected]> Run-TryBot: Joe Tsai <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent 8f06e21 commit 66b5a2f

File tree

2 files changed

+22
-24
lines changed

2 files changed

+22
-24
lines changed

src/archive/tar/common.go

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -158,11 +158,15 @@ func (fi headerFileInfo) Mode() (mode os.FileMode) {
158158
// sysStat, if non-nil, populates h from system-dependent fields of fi.
159159
var sysStat func(fi os.FileInfo, h *Header) error
160160

161-
// Mode constants from the tar spec.
162161
const (
163-
c_ISUID = 04000 // Set uid
164-
c_ISGID = 02000 // Set gid
165-
c_ISVTX = 01000 // Save text (sticky bit)
162+
// Mode constants from the USTAR spec:
163+
// See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_13_06
164+
c_ISUID = 04000 // Set uid
165+
c_ISGID = 02000 // Set gid
166+
c_ISVTX = 01000 // Save text (sticky bit)
167+
168+
// Common Unix mode constants; these are not defined in any common tar standard.
169+
// Header.FileInfo understands these, but FileInfoHeader will never produce these.
166170
c_ISDIR = 040000 // Directory
167171
c_ISFIFO = 010000 // FIFO
168172
c_ISREG = 0100000 // Regular file
@@ -208,30 +212,24 @@ func FileInfoHeader(fi os.FileInfo, link string) (*Header, error) {
208212
}
209213
switch {
210214
case fm.IsRegular():
211-
h.Mode |= c_ISREG
212215
h.Typeflag = TypeReg
213216
h.Size = fi.Size()
214217
case fi.IsDir():
215218
h.Typeflag = TypeDir
216-
h.Mode |= c_ISDIR
217219
h.Name += "/"
218220
case fm&os.ModeSymlink != 0:
219221
h.Typeflag = TypeSymlink
220-
h.Mode |= c_ISLNK
221222
h.Linkname = link
222223
case fm&os.ModeDevice != 0:
223224
if fm&os.ModeCharDevice != 0 {
224-
h.Mode |= c_ISCHR
225225
h.Typeflag = TypeChar
226226
} else {
227-
h.Mode |= c_ISBLK
228227
h.Typeflag = TypeBlock
229228
}
230229
case fm&os.ModeNamedPipe != 0:
231230
h.Typeflag = TypeFifo
232-
h.Mode |= c_ISFIFO
233231
case fm&os.ModeSocket != 0:
234-
h.Mode |= c_ISSOCK
232+
return nil, fmt.Errorf("archive/tar: sockets not supported")
235233
default:
236234
return nil, fmt.Errorf("archive/tar: unknown file mode %v", fm)
237235
}

src/archive/tar/tar_test.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func TestFileInfoHeader(t *testing.T) {
2929
if g, e := h.Name, "small.txt"; g != e {
3030
t.Errorf("Name = %q; want %q", g, e)
3131
}
32-
if g, e := h.Mode, int64(fi.Mode().Perm())|c_ISREG; g != e {
32+
if g, e := h.Mode, int64(fi.Mode().Perm()); g != e {
3333
t.Errorf("Mode = %#o; want %#o", g, e)
3434
}
3535
if g, e := h.Size, int64(5); g != e {
@@ -57,7 +57,7 @@ func TestFileInfoHeaderDir(t *testing.T) {
5757
t.Errorf("Name = %q; want %q", g, e)
5858
}
5959
// Ignoring c_ISGID for golang.org/issue/4867
60-
if g, e := h.Mode&^c_ISGID, int64(fi.Mode().Perm())|c_ISDIR; g != e {
60+
if g, e := h.Mode&^c_ISGID, int64(fi.Mode().Perm()); g != e {
6161
t.Errorf("Mode = %#o; want %#o", g, e)
6262
}
6363
if g, e := h.Size, int64(0); g != e {
@@ -157,7 +157,7 @@ func TestHeaderRoundTrip(t *testing.T) {
157157
// regular file.
158158
h: &Header{
159159
Name: "test.txt",
160-
Mode: 0644 | c_ISREG,
160+
Mode: 0644,
161161
Size: 12,
162162
ModTime: time.Unix(1360600916, 0),
163163
Typeflag: TypeReg,
@@ -167,7 +167,7 @@ func TestHeaderRoundTrip(t *testing.T) {
167167
// symbolic link.
168168
h: &Header{
169169
Name: "link.txt",
170-
Mode: 0777 | c_ISLNK,
170+
Mode: 0777,
171171
Size: 0,
172172
ModTime: time.Unix(1360600852, 0),
173173
Typeflag: TypeSymlink,
@@ -177,7 +177,7 @@ func TestHeaderRoundTrip(t *testing.T) {
177177
// character device node.
178178
h: &Header{
179179
Name: "dev/null",
180-
Mode: 0666 | c_ISCHR,
180+
Mode: 0666,
181181
Size: 0,
182182
ModTime: time.Unix(1360578951, 0),
183183
Typeflag: TypeChar,
@@ -187,7 +187,7 @@ func TestHeaderRoundTrip(t *testing.T) {
187187
// block device node.
188188
h: &Header{
189189
Name: "dev/sda",
190-
Mode: 0660 | c_ISBLK,
190+
Mode: 0660,
191191
Size: 0,
192192
ModTime: time.Unix(1360578954, 0),
193193
Typeflag: TypeBlock,
@@ -197,7 +197,7 @@ func TestHeaderRoundTrip(t *testing.T) {
197197
// directory.
198198
h: &Header{
199199
Name: "dir/",
200-
Mode: 0755 | c_ISDIR,
200+
Mode: 0755,
201201
Size: 0,
202202
ModTime: time.Unix(1360601116, 0),
203203
Typeflag: TypeDir,
@@ -207,7 +207,7 @@ func TestHeaderRoundTrip(t *testing.T) {
207207
// fifo node.
208208
h: &Header{
209209
Name: "dev/initctl",
210-
Mode: 0600 | c_ISFIFO,
210+
Mode: 0600,
211211
Size: 0,
212212
ModTime: time.Unix(1360578949, 0),
213213
Typeflag: TypeFifo,
@@ -217,7 +217,7 @@ func TestHeaderRoundTrip(t *testing.T) {
217217
// setuid.
218218
h: &Header{
219219
Name: "bin/su",
220-
Mode: 0755 | c_ISREG | c_ISUID,
220+
Mode: 0755 | c_ISUID,
221221
Size: 23232,
222222
ModTime: time.Unix(1355405093, 0),
223223
Typeflag: TypeReg,
@@ -227,7 +227,7 @@ func TestHeaderRoundTrip(t *testing.T) {
227227
// setguid.
228228
h: &Header{
229229
Name: "group.txt",
230-
Mode: 0750 | c_ISREG | c_ISGID,
230+
Mode: 0750 | c_ISGID,
231231
Size: 0,
232232
ModTime: time.Unix(1360602346, 0),
233233
Typeflag: TypeReg,
@@ -237,7 +237,7 @@ func TestHeaderRoundTrip(t *testing.T) {
237237
// sticky.
238238
h: &Header{
239239
Name: "sticky.txt",
240-
Mode: 0600 | c_ISREG | c_ISVTX,
240+
Mode: 0600 | c_ISVTX,
241241
Size: 7,
242242
ModTime: time.Unix(1360602540, 0),
243243
Typeflag: TypeReg,
@@ -247,7 +247,7 @@ func TestHeaderRoundTrip(t *testing.T) {
247247
// hard link.
248248
h: &Header{
249249
Name: "hard.txt",
250-
Mode: 0644 | c_ISREG,
250+
Mode: 0644,
251251
Size: 0,
252252
Linkname: "file.txt",
253253
ModTime: time.Unix(1360600916, 0),
@@ -258,7 +258,7 @@ func TestHeaderRoundTrip(t *testing.T) {
258258
// More information.
259259
h: &Header{
260260
Name: "info.txt",
261-
Mode: 0600 | c_ISREG,
261+
Mode: 0600,
262262
Size: 0,
263263
Uid: 1000,
264264
Gid: 1000,

0 commit comments

Comments
 (0)