[Docker-maint] Bug#739586: [PATCH] add debian/patches/add-tar-xattr-support.patch

Paul Tagliamonte paultag at debian.org
Sun Feb 23 20:36:00 UTC 2014


Ping? Can we please get this merged? It's blocking docker 0.8.1

Thanks!
  Paul

On Wed, Feb 19, 2014 at 11:56:10PM -0800, Johan Euphrosine wrote:
> Package: golang
> Version: 2:1.2-2
> Severity: wishlist
> 
> to backport support for tar xattr from upcoming golang1.3
> ---
>  debian/golang-src.install                  |   1 +
>  debian/patches/add-tar-xattr-support.patch | 175 +++++++++++++++++++++++++++++
>  debian/patches/series                      |   1 +
>  debian/source/include-binaries             |   1 +
>  debian/xattrs.tar                          | Bin 0 -> 5120 bytes
>  5 files changed, 178 insertions(+)
>  create mode 100644 debian/patches/add-tar-xattr-support.patch
>  create mode 100644 debian/source/include-binaries
>  create mode 100644 debian/xattrs.tar
> 
> diff --git a/debian/golang-src.install b/debian/golang-src.install
> index f034ba5..726c5b4 100644
> --- a/debian/golang-src.install
> +++ b/debian/golang-src.install
> @@ -1,2 +1,3 @@
>  src /usr/share/go/
>  test /usr/share/go/
> +debian/xattrs.tar /usr/share/go/src/pkg/archive/tar/testdata
> diff --git a/debian/patches/add-tar-xattr-support.patch b/debian/patches/add-tar-xattr-support.patch
> new file mode 100644
> index 0000000..904e011
> --- /dev/null
> +++ b/debian/patches/add-tar-xattr-support.patch
> @@ -0,0 +1,175 @@
> +--- a/src/pkg/archive/tar/common.go
> ++++ b/src/pkg/archive/tar/common.go
> +@@ -57,6 +57,7 @@
> + 	Devminor   int64     // minor number of character or block device
> + 	AccessTime time.Time // access time
> + 	ChangeTime time.Time // status change time
> ++	Xattrs     map[string]string
> + }
> + 
> + // File name constants from the tar spec.
> +@@ -189,6 +190,7 @@
> + 	paxSize     = "size"
> + 	paxUid      = "uid"
> + 	paxUname    = "uname"
> ++	paxXattr    = "SCHILY.xattr."
> + 	paxNone     = ""
> + )
> + 
> +--- a/src/pkg/archive/tar/reader.go
> ++++ b/src/pkg/archive/tar/reader.go
> +@@ -139,8 +139,14 @@
> + 				return err
> + 			}
> + 			hdr.Size = int64(size)
> ++		default:
> ++			if strings.HasPrefix(k, paxXattr) {
> ++				if hdr.Xattrs == nil {
> ++					hdr.Xattrs = make(map[string]string)
> ++				}
> ++				hdr.Xattrs[k[len(paxXattr):]] = v
> ++			}
> + 		}
> +-
> + 	}
> + 	return nil
> + }
> +--- a/src/pkg/archive/tar/reader_test.go
> ++++ b/src/pkg/archive/tar/reader_test.go
> +@@ -161,6 +161,46 @@
> + 			},
> + 		},
> + 	},
> ++	{
> ++		file: "testdata/xattrs.tar",
> ++		headers: []*Header{
> ++			{
> ++				Name:       "small.txt",
> ++				Mode:       0644,
> ++				Uid:        1000,
> ++				Gid:        10,
> ++				Size:       5,
> ++				ModTime:    time.Unix(1386065770, 448252320),
> ++				Typeflag:   '0',
> ++				Uname:      "alex",
> ++				Gname:      "wheel",
> ++				AccessTime: time.Unix(1389782991, 419875220),
> ++				ChangeTime: time.Unix(1389782956, 794414986),
> ++				Xattrs: map[string]string{
> ++					"user.key":  "value",
> ++					"user.key2": "value2",
> ++					// Interestingly, selinux encodes the terminating null inside the xattr
> ++					"security.selinux": "unconfined_u:object_r:default_t:s0\x00",
> ++				},
> ++			},
> ++			{
> ++				Name:       "small2.txt",
> ++				Mode:       0644,
> ++				Uid:        1000,
> ++				Gid:        10,
> ++				Size:       11,
> ++				ModTime:    time.Unix(1386065770, 449252304),
> ++				Typeflag:   '0',
> ++				Uname:      "alex",
> ++				Gname:      "wheel",
> ++				AccessTime: time.Unix(1389782991, 419875220),
> ++				ChangeTime: time.Unix(1386065770, 449252304),
> ++				Xattrs: map[string]string{
> ++					"security.selinux": "unconfined_u:object_r:default_t:s0\x00",
> ++				},
> ++			},
> ++		},
> ++	},
> + }
> + 
> + func TestReader(t *testing.T) {
> +@@ -180,7 +220,7 @@
> + 				f.Close()
> + 				continue testLoop
> + 			}
> +-			if *hdr != *header {
> ++			if !reflect.DeepEqual(*hdr, *header) {
> + 				t.Errorf("test %d, entry %d: Incorrect header:\nhave %+v\nwant %+v",
> + 					i, j, *hdr, *header)
> + 			}
> +@@ -253,7 +293,7 @@
> + 		}
> + 
> + 		// check the header
> +-		if *hdr != *headers[nread] {
> ++		if !reflect.DeepEqual(*hdr, *headers[nread]) {
> + 			t.Errorf("Incorrect header:\nhave %+v\nwant %+v",
> + 				*hdr, headers[nread])
> + 		}
> +Binary files /dev/null and b/src/pkg/archive/tar/testdata/xattrs.tar differ
> +--- a/src/pkg/archive/tar/writer.go
> ++++ b/src/pkg/archive/tar/writer.go
> +@@ -236,6 +236,12 @@
> + 		return tw.err
> + 	}
> + 
> ++	if allowPax {
> ++		for k, v := range hdr.Xattrs {
> ++			paxHeaders[paxXattr+k] = v
> ++		}
> ++	}
> ++
> + 	if len(paxHeaders) > 0 {
> + 		if !allowPax {
> + 			return errInvalidHeader
> +--- a/src/pkg/archive/tar/writer_test.go
> ++++ b/src/pkg/archive/tar/writer_test.go
> +@@ -10,6 +10,7 @@
> + 	"io"
> + 	"io/ioutil"
> + 	"os"
> ++	"reflect"
> + 	"strings"
> + 	"testing"
> + 	"testing/iotest"
> +@@ -338,6 +339,45 @@
> + 	}
> + }
> + 
> ++func TestPaxXattrs(t *testing.T) {
> ++	xattrs := map[string]string{
> ++		"user.key": "value",
> ++	}
> ++
> ++	// Create an archive with an xattr
> ++	fileinfo, err := os.Stat("testdata/small.txt")
> ++	if err != nil {
> ++		t.Fatal(err)
> ++	}
> ++	hdr, err := FileInfoHeader(fileinfo, "")
> ++	if err != nil {
> ++		t.Fatalf("os.Stat: %v", err)
> ++	}
> ++	contents := "Kilts"
> ++	hdr.Xattrs = xattrs
> ++	var buf bytes.Buffer
> ++	writer := NewWriter(&buf)
> ++	if err := writer.WriteHeader(hdr); err != nil {
> ++		t.Fatal(err)
> ++	}
> ++	if _, err = writer.Write([]byte(contents)); err != nil {
> ++		t.Fatal(err)
> ++	}
> ++	if err := writer.Close(); err != nil {
> ++		t.Fatal(err)
> ++	}
> ++	// Test that we can get the xattrs back out of the archive.
> ++	reader := NewReader(&buf)
> ++	hdr, err = reader.Next()
> ++	if err != nil {
> ++		t.Fatal(err)
> ++	}
> ++	if !reflect.DeepEqual(hdr.Xattrs, xattrs) {
> ++		t.Fatalf("xattrs did not survive round trip: got %+v, want %+v",
> ++			hdr.Xattrs, xattrs)
> ++	}
> ++}
> ++
> + func TestPAXHeader(t *testing.T) {
> + 	medName := strings.Repeat("CD", 50)
> + 	longName := strings.Repeat("AB", 100)
> diff --git a/debian/patches/series b/debian/patches/series
> index 6da8b45..0a51bc1 100644
> --- a/debian/patches/series
> +++ b/debian/patches/series
> @@ -1 +1,2 @@
>  add-src-pkg-debug-elf-testdata-hello.patch
> +add-tar-xattr-support.patch
> diff --git a/debian/source/include-binaries b/debian/source/include-binaries
> new file mode 100644
> index 0000000..0222ae3
> --- /dev/null
> +++ b/debian/source/include-binaries
> @@ -0,0 +1 @@
> +debian/xattrs.tar
> \ No newline at end of file
> diff --git a/debian/xattrs.tar b/debian/xattrs.tar
> new file mode 100644
> index 0000000000000000000000000000000000000000..9701950edd1f0dc82858b7117136b37391be0b08
> GIT binary patch
> literal 5120
> zcmeHJv2KGf5M|~o_yWg1+khiw>d;i}P^nX=$R$ooYd`|ilD{uBAv6g^kxC>6-(uu<
> zHg^v_-l5r}td>fyRbC(vfcdOQq}Iq(#u+Ja9X?}Dv(|CCVoJF~09ZgF;2a!G7^%~|
> zYNYoMUQ-rE=5<MfNf&^--n!;4I5LG45ME;9L at fvneeClfz=*LBI8bnFP`025LJ)!=
> zMno8J0GDDfIs&<m0>KzzBJ^EKyr-Mx-NQ4gq%k=v3zee}wOxElT`HH-ei(K*xV|_}
> zC{$GDvDu<R={PN`MVUrfx`|V at UX}Cg<y}Q)mCx5|BTH>oW?o>&odUrVuVHkt_w?IH
> zW3PV_ at V!Jxt at A^i>Yrj(>;K=H?5X8!tJS~MYVd#a^`?|QJKb&Uduf~MfN4M7$J!Lr
> zF40zZMF!9x{tqJ#0F5+;{2!=)=Knre|G(mAKU`hAc#r>!#{V(9d;sW1hxVv7 at B_zF
> ze)#eKF~#1~>@WTI`#+&4`lkel_5U6!N8h^5vRAE8lqGgr9-Ul!p=H1_U>TS&1K)l2
> B)fNB%
> 
> literal 0
> HcmV?d00001
> 
> -- 
> 1.9.0.rc1.175.g0b1dcb5
> 

-- 
 .''`.  Paul Tagliamonte <paultag at debian.org>  |   Proud Debian Developer
: :'  : 4096R / 8F04 9AD8 2C92 066C 7352  D28A 7B58 5B30 807C 2A87
`. `'`  http://people.debian.org/~paultag
 `-     http://people.debian.org/~paultag/conduct-statement.txt
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.alioth.debian.org/pipermail/docker-maint/attachments/20140223/c73f8c38/attachment.sig>


More information about the Docker-maint mailing list