From a39a27040dc62141f1fb6c3a8fe96a704471b4f2 Mon Sep 17 00:00:00 2001 From: Chris Novakovic Date: Wed, 8 Oct 2025 20:52:21 +0100 Subject: [PATCH] Writer: don't write a file mode for the string table String tables in GNU-variant archives aren't real files and don't require a file mode - leave the field empty. --- writer.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/writer.go b/writer.go index 4981d28..d3fe9c8 100644 --- a/writer.go +++ b/writer.go @@ -183,7 +183,7 @@ func (aw *Writer) WriteStringTable(filenames []string) error { return nil } // need at least one long filename - if err := aw.WriteHeader(&Header{Name: "//", Mode: 0420, Size: int64(len(data))}); err != nil { + if err := aw.WriteHeader(&Header{Name: "//", Size: int64(len(data))}); err != nil { return err } _, err := io.Copy(aw, bytes.NewReader(data)) @@ -256,7 +256,13 @@ func (aw *Writer) WriteHeader(hdr *Header) error { aw.numeric(s.next(12), hdr.ModTime.Unix()) aw.numeric(s.next(6), int64(hdr.Uid)) aw.numeric(s.next(6), int64(hdr.Gid)) - aw.octal(s.next(8), hdr.Mode) + // Only headers representing real files require file mode values - write an empty file mode field + // for the string table in GNU-variant archives. + if aw.variant == GNU && hdr.Name == "//" { + aw.string(s.next(8), "") + } else { + aw.octal(s.next(8), hdr.Mode) + } aw.numeric(s.next(10), hdr.Size) aw.string(s.next(2), "`\n")