From 87f9fdb06519594d8f26d6a20f85e79b9a35d8bf Mon Sep 17 00:00:00 2001 From: Johannes Frey Date: Tue, 16 Jun 2020 08:53:36 +0200 Subject: [PATCH 1/4] Cope with double quotes in Linux Mountinfo Signed-off-by: Johannes Frey --- mount/mountinfo_linux.go | 4 +-- mount/mountinfo_linux_test.go | 48 +++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/mount/mountinfo_linux.go b/mount/mountinfo_linux.go index d089890fe..a8f2cc68c 100644 --- a/mount/mountinfo_linux.go +++ b/mount/mountinfo_linux.go @@ -81,11 +81,11 @@ func parseInfoFile(r io.Reader) ([]Info, error) { p.Major, _ = strconv.Atoi(mm[0]) p.Minor, _ = strconv.Atoi(mm[1]) - p.Root, err = strconv.Unquote(`"` + fields[3] + `"`) + p.Root, err = strconv.Unquote(`"` + strings.Replace(fields[3], `"`, `\"`, -1) + `"`) if err != nil { return nil, errors.Wrapf(err, "parsing '%s' failed: unable to unquote root field", fields[3]) } - p.Mountpoint, err = strconv.Unquote(`"` + fields[4] + `"`) + p.Mountpoint, err = strconv.Unquote(`"` + strings.Replace(fields[4], `"`, `\"`, -1) + `"`) if err != nil { return nil, errors.Wrapf(err, "parsing '%s' failed: unable to unquote mount point field", fields[4]) } diff --git a/mount/mountinfo_linux_test.go b/mount/mountinfo_linux_test.go index 08eb5e908..23c0a7856 100644 --- a/mount/mountinfo_linux_test.go +++ b/mount/mountinfo_linux_test.go @@ -439,6 +439,9 @@ const ( mountInfoWithSpaces = `486 28 252:1 / /mnt/foo\040bar rw,relatime shared:243 - ext4 /dev/vda1 rw,data=ordered 31 21 0:23 / /DATA/foo_bla_bla rw,relatime - cifs //foo/BLA\040BLA\040BLA/ rw,sec=ntlm,cache=loose,unc=\\foo\BLA BLA BLA,username=my_login,domain=mydomain.com,uid=12345678,forceuid,gid=12345678,forcegid,addr=10.1.30.10,file_mode=0755,dir_mode=0755,nounix,rsize=61440,wsize=65536,actimeo=1` + + mountInfoWithDoubleQuotes = `1046 30 253:1 /tmp/bar /var/lib/kubelet/pods/98d150a4-d814-4d52-9068-b10f62d7a895/volumes/kubernetes.io~empty-dir/tmp-dir/"var rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro +1046 30 253:1 /tmp/bar /tmp/"foo" rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro` ) func TestParseFedoraMountinfo(t *testing.T) { @@ -538,3 +541,48 @@ func TestParseMountinfoWithSpaces(t *testing.T) { } } } + +func TestParseMountinfoWithDoubleQuotes(t *testing.T) { + r := bytes.NewBuffer([]byte(mountInfoWithDoubleQuotes)) + infos, err := parseInfoFile(r) + if err != nil { + t.Fatal(err) + } + expected := []Info{ + { + ID: 1046, + Parent: 30, + Major: 253, + Minor: 1, + Root: "/tmp/bar", + Mountpoint: `/var/lib/kubelet/pods/98d150a4-d814-4d52-9068-b10f62d7a895/volumes/kubernetes.io~empty-dir/tmp-dir/"var`, + Options: "rw,relatime", + Optional: "shared:1", + FSType: "ext4", + Source: "/dev/mapper/ubuntu--vg-root", + VFSOptions: "rw,errors=remount-ro", + }, + { + ID: 1046, + Parent: 30, + Major: 253, + Minor: 1, + Root: "/tmp/bar", + Mountpoint: `/tmp/"foo"`, + Options: "rw,relatime", + Optional: "shared:1", + FSType: "ext4", + Source: "/dev/mapper/ubuntu--vg-root", + VFSOptions: "rw,errors=remount-ro", + }, + } + + if len(infos) != len(expected) { + t.Fatalf("expected %d entries, got %d", len(expected), len(infos)) + } + for i, mi := range expected { + if infos[i] != mi { + t.Fatalf("expected %#v, got %#v", mi, infos[i]) + } + } +} From cb91b1724dec212db7ba68958f2b7aba8a4ceee9 Mon Sep 17 00:00:00 2001 From: Johannes Frey Date: Tue, 16 Jun 2020 11:55:50 +0200 Subject: [PATCH 2/4] Add testcase containing mountpoint with escaped backslash Signed-off-by: Johannes Frey --- mount/mountinfo_linux_test.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/mount/mountinfo_linux_test.go b/mount/mountinfo_linux_test.go index 23c0a7856..eafd7d582 100644 --- a/mount/mountinfo_linux_test.go +++ b/mount/mountinfo_linux_test.go @@ -441,7 +441,8 @@ const ( 31 21 0:23 / /DATA/foo_bla_bla rw,relatime - cifs //foo/BLA\040BLA\040BLA/ rw,sec=ntlm,cache=loose,unc=\\foo\BLA BLA BLA,username=my_login,domain=mydomain.com,uid=12345678,forceuid,gid=12345678,forcegid,addr=10.1.30.10,file_mode=0755,dir_mode=0755,nounix,rsize=61440,wsize=65536,actimeo=1` mountInfoWithDoubleQuotes = `1046 30 253:1 /tmp/bar /var/lib/kubelet/pods/98d150a4-d814-4d52-9068-b10f62d7a895/volumes/kubernetes.io~empty-dir/tmp-dir/"var rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro -1046 30 253:1 /tmp/bar /tmp/"foo" rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro` +1046 30 253:1 /tmp/bar /tmp/"foo" rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro +1060 30 253:1 /tmp/bar /tmp/\134"foo\134" rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro` ) func TestParseFedoraMountinfo(t *testing.T) { @@ -575,6 +576,19 @@ func TestParseMountinfoWithDoubleQuotes(t *testing.T) { Source: "/dev/mapper/ubuntu--vg-root", VFSOptions: "rw,errors=remount-ro", }, + { + ID: 1060, + Parent: 30, + Major: 253, + Minor: 1, + Root: "/tmp/bar", + Mountpoint: `/tmp/\"foo\"`, + Options: "rw,relatime", + Optional: "shared:1", + FSType: "ext4", + Source: "/dev/mapper/ubuntu--vg-root", + VFSOptions: "rw,errors=remount-ro", + }, } if len(infos) != len(expected) { From 8897e152030ec3d6076558388f84e447a7be1b64 Mon Sep 17 00:00:00 2001 From: Johannes Frey Date: Tue, 16 Jun 2020 13:02:53 +0200 Subject: [PATCH 3/4] Add more test cases with single quotes Signed-off-by: Johannes Frey --- mount/mountinfo_linux_test.go | 36 +++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/mount/mountinfo_linux_test.go b/mount/mountinfo_linux_test.go index eafd7d582..3b0b6bedb 100644 --- a/mount/mountinfo_linux_test.go +++ b/mount/mountinfo_linux_test.go @@ -440,9 +440,11 @@ const ( mountInfoWithSpaces = `486 28 252:1 / /mnt/foo\040bar rw,relatime shared:243 - ext4 /dev/vda1 rw,data=ordered 31 21 0:23 / /DATA/foo_bla_bla rw,relatime - cifs //foo/BLA\040BLA\040BLA/ rw,sec=ntlm,cache=loose,unc=\\foo\BLA BLA BLA,username=my_login,domain=mydomain.com,uid=12345678,forceuid,gid=12345678,forcegid,addr=10.1.30.10,file_mode=0755,dir_mode=0755,nounix,rsize=61440,wsize=65536,actimeo=1` - mountInfoWithDoubleQuotes = `1046 30 253:1 /tmp/bar /var/lib/kubelet/pods/98d150a4-d814-4d52-9068-b10f62d7a895/volumes/kubernetes.io~empty-dir/tmp-dir/"var rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro + mountInfoWithQuotes = `1046 30 253:1 /tmp/bar /var/lib/kubelet/pods/98d150a4-d814-4d52-9068-b10f62d7a895/volumes/kubernetes.io~empty-dir/tmp-dir/"var rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro 1046 30 253:1 /tmp/bar /tmp/"foo" rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro -1060 30 253:1 /tmp/bar /tmp/\134"foo\134" rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro` +1060 30 253:1 /tmp/bar /tmp/\134"foo\134" rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro +1060 30 253:1 /tmp/"what's\040up?" /tmp/foo rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro +1100 1060 253:1 /tmp/'what's\040up?' /tmp/foo rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro` ) func TestParseFedoraMountinfo(t *testing.T) { @@ -543,8 +545,8 @@ func TestParseMountinfoWithSpaces(t *testing.T) { } } -func TestParseMountinfoWithDoubleQuotes(t *testing.T) { - r := bytes.NewBuffer([]byte(mountInfoWithDoubleQuotes)) +func TestParseMountinfoWithQuotes(t *testing.T) { + r := bytes.NewBuffer([]byte(mountInfoWithQuotes)) infos, err := parseInfoFile(r) if err != nil { t.Fatal(err) @@ -589,6 +591,32 @@ func TestParseMountinfoWithDoubleQuotes(t *testing.T) { Source: "/dev/mapper/ubuntu--vg-root", VFSOptions: "rw,errors=remount-ro", }, + { + ID: 1060, + Parent: 30, + Major: 253, + Minor: 1, + Root: `/tmp/"what's up?"`, + Mountpoint: "/tmp/foo", + Options: "rw,relatime", + Optional: "shared:1", + FSType: "ext4", + Source: "/dev/mapper/ubuntu--vg-root", + VFSOptions: "rw,errors=remount-ro", + }, + { + ID: 1100, + Parent: 1060, + Major: 253, + Minor: 1, + Root: `/tmp/'what's up?'`, + Mountpoint: "/tmp/foo", + Options: "rw,relatime", + Optional: "shared:1", + FSType: "ext4", + Source: "/dev/mapper/ubuntu--vg-root", + VFSOptions: "rw,errors=remount-ro", + }, } if len(infos) != len(expected) { From ee734e867ab9732a7c42028be1e8a8a76ac3da84 Mon Sep 17 00:00:00 2001 From: Johannes Frey Date: Thu, 18 Jun 2020 08:32:00 +0200 Subject: [PATCH 4/4] Add test case with backticks Signed-off-by: Johannes Frey --- mount/mountinfo_linux_test.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/mount/mountinfo_linux_test.go b/mount/mountinfo_linux_test.go index 3b0b6bedb..76bfd18ec 100644 --- a/mount/mountinfo_linux_test.go +++ b/mount/mountinfo_linux_test.go @@ -444,7 +444,9 @@ const ( 1046 30 253:1 /tmp/bar /tmp/"foo" rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro 1060 30 253:1 /tmp/bar /tmp/\134"foo\134" rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro 1060 30 253:1 /tmp/"what's\040up?" /tmp/foo rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro -1100 1060 253:1 /tmp/'what's\040up?' /tmp/foo rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro` +1100 1060 253:1 /tmp/'what's\040up?' /tmp/foo rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro` + + // Last must be appended because literal backticks are also valid. + "\n1047 30 253:1 /tmp/`foo` /tmp/bar rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-root rw,errors=remount-ro" ) func TestParseFedoraMountinfo(t *testing.T) { @@ -617,6 +619,19 @@ func TestParseMountinfoWithQuotes(t *testing.T) { Source: "/dev/mapper/ubuntu--vg-root", VFSOptions: "rw,errors=remount-ro", }, + { + ID: 1047, + Parent: 30, + Major: 253, + Minor: 1, + Root: "/tmp/`foo`", + Mountpoint: "/tmp/bar", + Options: "rw,relatime", + Optional: "shared:1", + FSType: "ext4", + Source: "/dev/mapper/ubuntu--vg-root", + VFSOptions: "rw,errors=remount-ro", + }, } if len(infos) != len(expected) {