mirror of
https://github.com/containers/skopeo.git
synced 2025-07-05 19:06:54 +00:00
Merge pull request #1138 from containers/dependabot/go_modules/github.com/containers/common-0.31.1
Bump github.com/containers/common from 0.31.0 to 0.31.1
This commit is contained in:
commit
c339a1abe9
2
go.mod
2
go.mod
@ -3,7 +3,7 @@ module github.com/containers/skopeo
|
|||||||
go 1.12
|
go 1.12
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/containers/common v0.31.0
|
github.com/containers/common v0.31.1
|
||||||
github.com/containers/image/v5 v5.9.0
|
github.com/containers/image/v5 v5.9.0
|
||||||
github.com/containers/ocicrypt v1.0.3
|
github.com/containers/ocicrypt v1.0.3
|
||||||
github.com/containers/storage v1.24.3
|
github.com/containers/storage v1.24.3
|
||||||
|
18
go.sum
18
go.sum
@ -60,10 +60,8 @@ github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv
|
|||||||
github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
|
github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
|
||||||
github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
|
github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
|
||||||
github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
|
github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
|
||||||
github.com/containers/common v0.31.0 h1:SRnjfoqbjfaojpY9YJq9JBPEslwB5hoXJbaE+5zMFwM=
|
github.com/containers/common v0.31.1 h1:oBINnZpYZ2u90HPMnVCXOhm/TsTaTB7wU/56l05hq44=
|
||||||
github.com/containers/common v0.31.0/go.mod h1:yT4GTUHsKRmpaDb+mecXRnIMre7W3ZgwXqaYMywXlaA=
|
github.com/containers/common v0.31.1/go.mod h1:Fehe82hQfJQvDspnRrV9rcdAWG3IalNHEt0F6QWNBHQ=
|
||||||
github.com/containers/image/v5 v5.8.1 h1:aHW8a/Kd0dTJ7PTL/fc6y12sJqHxWgqilu+XyHfjD8Q=
|
|
||||||
github.com/containers/image/v5 v5.8.1/go.mod h1:blOEFd/iFdeyh891ByhCVUc+xAcaI3gBegXECwz9UbQ=
|
|
||||||
github.com/containers/image/v5 v5.9.0 h1:dRmUtcluQcmasNo3DpnRoZjfU0rOu1qZeL6wlDJr10Q=
|
github.com/containers/image/v5 v5.9.0 h1:dRmUtcluQcmasNo3DpnRoZjfU0rOu1qZeL6wlDJr10Q=
|
||||||
github.com/containers/image/v5 v5.9.0/go.mod h1:blOEFd/iFdeyh891ByhCVUc+xAcaI3gBegXECwz9UbQ=
|
github.com/containers/image/v5 v5.9.0/go.mod h1:blOEFd/iFdeyh891ByhCVUc+xAcaI3gBegXECwz9UbQ=
|
||||||
github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b h1:Q8ePgVfHDplZ7U33NwHZkrVELsZP5fYj9pM5WBZB2GE=
|
github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b h1:Q8ePgVfHDplZ7U33NwHZkrVELsZP5fYj9pM5WBZB2GE=
|
||||||
@ -71,8 +69,6 @@ github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b/go.mod h1:9rfv
|
|||||||
github.com/containers/ocicrypt v1.0.3 h1:vYgl+RZ9Q3DPMuTfxmN+qp0X2Bj52uuY2vnt6GzVe1c=
|
github.com/containers/ocicrypt v1.0.3 h1:vYgl+RZ9Q3DPMuTfxmN+qp0X2Bj52uuY2vnt6GzVe1c=
|
||||||
github.com/containers/ocicrypt v1.0.3/go.mod h1:CUBa+8MRNL/VkpxYIpaMtgn1WgXGyvPQj8jcy0EVG6g=
|
github.com/containers/ocicrypt v1.0.3/go.mod h1:CUBa+8MRNL/VkpxYIpaMtgn1WgXGyvPQj8jcy0EVG6g=
|
||||||
github.com/containers/storage v1.23.7/go.mod h1:cUT2zHjtx+WlVri30obWmM2gpqpi8jfPsmIzP1TVpEI=
|
github.com/containers/storage v1.23.7/go.mod h1:cUT2zHjtx+WlVri30obWmM2gpqpi8jfPsmIzP1TVpEI=
|
||||||
github.com/containers/storage v1.24.1 h1:1+f8fy6ly35c8SLet5jzZ8t0WJJs5+xSpfMAYw0R3kc=
|
|
||||||
github.com/containers/storage v1.24.1/go.mod h1:0xJL06Dmd+ZYXIUdnBUPN0JnhHGgwMkLvnnAonJfWJU=
|
|
||||||
github.com/containers/storage v1.24.3 h1:8UB4S62l4hrU6Yw3dbsLCJtLg7Ofo39IN2HdckBIX4E=
|
github.com/containers/storage v1.24.3 h1:8UB4S62l4hrU6Yw3dbsLCJtLg7Ofo39IN2HdckBIX4E=
|
||||||
github.com/containers/storage v1.24.3/go.mod h1:0xJL06Dmd+ZYXIUdnBUPN0JnhHGgwMkLvnnAonJfWJU=
|
github.com/containers/storage v1.24.3/go.mod h1:0xJL06Dmd+ZYXIUdnBUPN0JnhHGgwMkLvnnAonJfWJU=
|
||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||||
@ -271,7 +267,7 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108
|
|||||||
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||||
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ=
|
||||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
||||||
@ -294,6 +290,8 @@ github.com/opencontainers/runtime-tools v0.9.0/go.mod h1:r3f7wjNzSs2extwzU3Y+6pK
|
|||||||
github.com/opencontainers/selinux v1.5.1/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
|
github.com/opencontainers/selinux v1.5.1/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
|
||||||
github.com/opencontainers/selinux v1.6.0 h1:+bIAS/Za3q5FTwWym4fTB0vObnfCf3G/NC7K6Jx62mY=
|
github.com/opencontainers/selinux v1.6.0 h1:+bIAS/Za3q5FTwWym4fTB0vObnfCf3G/NC7K6Jx62mY=
|
||||||
github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE=
|
github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE=
|
||||||
|
github.com/opencontainers/selinux v1.8.0 h1:+77ba4ar4jsCbL1GLbFL8fFM57w6suPfSS9PDLDY7KM=
|
||||||
|
github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo=
|
||||||
github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw=
|
github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw=
|
||||||
github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc=
|
github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc=
|
||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||||
@ -386,6 +384,8 @@ github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYp
|
|||||||
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
|
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
|
||||||
github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243 h1:R43TdZy32XXSXjJn7M/HhALJ9imq6ztLnChfYJpVDnM=
|
github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243 h1:R43TdZy32XXSXjJn7M/HhALJ9imq6ztLnChfYJpVDnM=
|
||||||
github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
|
github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
|
||||||
|
github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE=
|
||||||
|
github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b h1:6cLsL+2FW6dRAdl5iMtHgRogVCff0QpRi9653YmdcJA=
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b h1:6cLsL+2FW6dRAdl5iMtHgRogVCff0QpRi9653YmdcJA=
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||||
@ -453,8 +453,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
|
|||||||
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0 h1:wBouT66WTYFXdxfVdz9sVWARVd/2vfGcmI45D2gj45M=
|
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U=
|
||||||
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
3
vendor/github.com/opencontainers/selinux/go-selinux/doc.go
generated
vendored
3
vendor/github.com/opencontainers/selinux/go-selinux/doc.go
generated
vendored
@ -5,9 +5,6 @@ This package uses a selinux build tag to enable the selinux functionality. This
|
|||||||
allows non-linux and linux users who do not have selinux support to still use
|
allows non-linux and linux users who do not have selinux support to still use
|
||||||
tools that rely on this library.
|
tools that rely on this library.
|
||||||
|
|
||||||
To compile with full selinux support use the -tags=selinux option in your build
|
|
||||||
and test commands.
|
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
|
|
||||||
import "github.com/opencontainers/selinux/go-selinux"
|
import "github.com/opencontainers/selinux/go-selinux"
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
// +build selinux,linux
|
|
||||||
|
|
||||||
package label
|
package label
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -27,14 +25,14 @@ var ErrIncompatibleLabel = errors.New("Bad SELinux option z and Z can not be use
|
|||||||
// the container. A list of options can be passed into this function to alter
|
// the container. A list of options can be passed into this function to alter
|
||||||
// the labels. The labels returned will include a random MCS String, that is
|
// the labels. The labels returned will include a random MCS String, that is
|
||||||
// guaranteed to be unique.
|
// guaranteed to be unique.
|
||||||
func InitLabels(options []string) (plabel string, mlabel string, Err error) {
|
func InitLabels(options []string) (plabel string, mlabel string, retErr error) {
|
||||||
if !selinux.GetEnabled() {
|
if !selinux.GetEnabled() {
|
||||||
return "", "", nil
|
return "", "", nil
|
||||||
}
|
}
|
||||||
processLabel, mountLabel := selinux.ContainerLabels()
|
processLabel, mountLabel := selinux.ContainerLabels()
|
||||||
if processLabel != "" {
|
if processLabel != "" {
|
||||||
defer func() {
|
defer func() {
|
||||||
if Err != nil {
|
if retErr != nil {
|
||||||
selinux.ReleaseLabel(mountLabel)
|
selinux.ReleaseLabel(mountLabel)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@ -57,7 +55,6 @@ func InitLabels(options []string) (plabel string, mlabel string, Err error) {
|
|||||||
con := strings.SplitN(opt, ":", 2)
|
con := strings.SplitN(opt, ":", 2)
|
||||||
if !validOptions[con[0]] {
|
if !validOptions[con[0]] {
|
||||||
return "", "", errors.Errorf("Bad label option %q, valid options 'disable, user, role, level, type, filetype'", con[0])
|
return "", "", errors.Errorf("Bad label option %q, valid options 'disable, user, role, level, type, filetype'", con[0])
|
||||||
|
|
||||||
}
|
}
|
||||||
if con[0] == "filetype" {
|
if con[0] == "filetype" {
|
||||||
mcon["type"] = con[1]
|
mcon["type"] = con[1]
|
2
vendor/github.com/opencontainers/selinux/go-selinux/label/label_stub.go
generated
vendored
2
vendor/github.com/opencontainers/selinux/go-selinux/label/label_stub.go
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
// +build !selinux !linux
|
// +build !linux
|
||||||
|
|
||||||
package label
|
package label
|
||||||
|
|
||||||
|
41
vendor/github.com/opencontainers/selinux/go-selinux/selinux.go
generated
vendored
41
vendor/github.com/opencontainers/selinux/go-selinux/selinux.go
generated
vendored
@ -30,6 +30,11 @@ var (
|
|||||||
// ErrLevelSyntax is returned when a sensitivity or category do not have correct syntax in a level
|
// ErrLevelSyntax is returned when a sensitivity or category do not have correct syntax in a level
|
||||||
ErrLevelSyntax = errors.New("invalid level syntax")
|
ErrLevelSyntax = errors.New("invalid level syntax")
|
||||||
|
|
||||||
|
// ErrContextMissing is returned if a requested context is not found in a file.
|
||||||
|
ErrContextMissing = errors.New("context does not have a match")
|
||||||
|
// ErrVerifierNil is returned when a context verifier function is nil.
|
||||||
|
ErrVerifierNil = errors.New("verifier function is nil")
|
||||||
|
|
||||||
// CategoryRange allows the upper bound on the category range to be adjusted
|
// CategoryRange allows the upper bound on the category range to be adjusted
|
||||||
CategoryRange = DefaultCategoryRange
|
CategoryRange = DefaultCategoryRange
|
||||||
)
|
)
|
||||||
@ -63,8 +68,12 @@ func FileLabel(fpath string) (string, error) {
|
|||||||
return fileLabel(fpath)
|
return fileLabel(fpath)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetFSCreateLabel tells kernel the label to create all file system objects
|
// SetFSCreateLabel tells the kernel what label to use for all file system objects
|
||||||
// created by this task. Setting label="" to return to default.
|
// created by this task.
|
||||||
|
// Set the label to an empty string to return to the default label. Calls to SetFSCreateLabel
|
||||||
|
// should be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() until file system
|
||||||
|
// objects created by this task are finished to guarantee another goroutine does not migrate
|
||||||
|
// to the current thread before execution is complete.
|
||||||
func SetFSCreateLabel(label string) error {
|
func SetFSCreateLabel(label string) error {
|
||||||
return setFSCreateLabel(label)
|
return setFSCreateLabel(label)
|
||||||
}
|
}
|
||||||
@ -113,19 +122,27 @@ func CalculateGlbLub(sourceRange, targetRange string) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SetExecLabel sets the SELinux label that the kernel will use for any programs
|
// SetExecLabel sets the SELinux label that the kernel will use for any programs
|
||||||
// that are executed by the current process thread, or an error.
|
// that are executed by the current process thread, or an error. Calls to SetExecLabel
|
||||||
|
// should be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() until execution
|
||||||
|
// of the program is finished to guarantee another goroutine does not migrate to the current
|
||||||
|
// thread before execution is complete.
|
||||||
func SetExecLabel(label string) error {
|
func SetExecLabel(label string) error {
|
||||||
return setExecLabel(label)
|
return setExecLabel(label)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTaskLabel sets the SELinux label for the current thread, or an error.
|
// SetTaskLabel sets the SELinux label for the current thread, or an error.
|
||||||
// This requires the dyntransition permission.
|
// This requires the dyntransition permission. Calls to SetTaskLabel should
|
||||||
|
// be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() to guarantee
|
||||||
|
// the current thread does not run in a new mislabeled thread.
|
||||||
func SetTaskLabel(label string) error {
|
func SetTaskLabel(label string) error {
|
||||||
return setTaskLabel(label)
|
return setTaskLabel(label)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetSocketLabel takes a process label and tells the kernel to assign the
|
// SetSocketLabel takes a process label and tells the kernel to assign the
|
||||||
// label to the next socket that gets created
|
// label to the next socket that gets created. Calls to SetSocketLabel
|
||||||
|
// should be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() until
|
||||||
|
// the the socket is created to guarantee another goroutine does not migrate
|
||||||
|
// to the current thread before execution is complete.
|
||||||
func SetSocketLabel(label string) error {
|
func SetSocketLabel(label string) error {
|
||||||
return setSocketLabel(label)
|
return setSocketLabel(label)
|
||||||
}
|
}
|
||||||
@ -141,7 +158,10 @@ func PeerLabel(fd uintptr) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SetKeyLabel takes a process label and tells the kernel to assign the
|
// SetKeyLabel takes a process label and tells the kernel to assign the
|
||||||
// label to the next kernel keyring that gets created
|
// label to the next kernel keyring that gets created. Calls to SetKeyLabel
|
||||||
|
// should be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() until
|
||||||
|
// the kernel keyring is created to guarantee another goroutine does not migrate
|
||||||
|
// to the current thread before execution is complete.
|
||||||
func SetKeyLabel(label string) error {
|
func SetKeyLabel(label string) error {
|
||||||
return setKeyLabel(label)
|
return setKeyLabel(label)
|
||||||
}
|
}
|
||||||
@ -247,3 +267,12 @@ func DupSecOpt(src string) ([]string, error) {
|
|||||||
func DisableSecOpt() []string {
|
func DisableSecOpt() []string {
|
||||||
return disableSecOpt()
|
return disableSecOpt()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultContextWithLevel gets a single context for the specified SELinux user
|
||||||
|
// identity that is reachable from the specified scon context. The context is based
|
||||||
|
// on the per-user /etc/selinux/{SELINUXTYPE}/contexts/users/<username> if it exists,
|
||||||
|
// and falls back to the global /etc/selinux/{SELINUXTYPE}/contexts/default_contexts
|
||||||
|
// file.
|
||||||
|
func GetDefaultContextWithLevel(user, level, scon string) (string, error) {
|
||||||
|
return getDefaultContextWithLevel(user, level, scon)
|
||||||
|
}
|
||||||
|
224
vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go
generated
vendored
224
vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go
generated
vendored
@ -1,5 +1,3 @@
|
|||||||
// +build selinux,linux
|
|
||||||
|
|
||||||
package selinux
|
package selinux
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -28,6 +26,8 @@ const (
|
|||||||
minSensLen = 2
|
minSensLen = 2
|
||||||
contextFile = "/usr/share/containers/selinux/contexts"
|
contextFile = "/usr/share/containers/selinux/contexts"
|
||||||
selinuxDir = "/etc/selinux/"
|
selinuxDir = "/etc/selinux/"
|
||||||
|
selinuxUsersDir = "contexts/users"
|
||||||
|
defaultContexts = "contexts/default_contexts"
|
||||||
selinuxConfig = selinuxDir + "config"
|
selinuxConfig = selinuxDir + "config"
|
||||||
selinuxfsMount = "/sys/fs/selinux"
|
selinuxfsMount = "/sys/fs/selinux"
|
||||||
selinuxTypeTag = "SELINUXTYPE"
|
selinuxTypeTag = "SELINUXTYPE"
|
||||||
@ -35,6 +35,8 @@ const (
|
|||||||
xattrNameSelinux = "security.selinux"
|
xattrNameSelinux = "security.selinux"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var policyRoot = filepath.Join(selinuxDir, readConfig(selinuxTypeTag))
|
||||||
|
|
||||||
type selinuxState struct {
|
type selinuxState struct {
|
||||||
enabledSet bool
|
enabledSet bool
|
||||||
enabled bool
|
enabled bool
|
||||||
@ -54,6 +56,13 @@ type mlsRange struct {
|
|||||||
high *level
|
high *level
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type defaultSECtx struct {
|
||||||
|
user, level, scon string
|
||||||
|
userRdr, defaultRdr io.Reader
|
||||||
|
|
||||||
|
verifier func(string) error
|
||||||
|
}
|
||||||
|
|
||||||
type levelItem byte
|
type levelItem byte
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -111,7 +120,7 @@ func verifySELinuxfsMount(mnt string) bool {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if err == unix.EAGAIN {
|
if err == unix.EAGAIN || err == unix.EINTR {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
@ -205,28 +214,16 @@ func getEnabled() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func readConfig(target string) string {
|
func readConfig(target string) string {
|
||||||
var (
|
|
||||||
val, key string
|
|
||||||
bufin *bufio.Reader
|
|
||||||
)
|
|
||||||
|
|
||||||
in, err := os.Open(selinuxConfig)
|
in, err := os.Open(selinuxConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
defer in.Close()
|
defer in.Close()
|
||||||
|
|
||||||
bufin = bufio.NewReader(in)
|
scanner := bufio.NewScanner(in)
|
||||||
|
|
||||||
for done := false; !done; {
|
for scanner.Scan() {
|
||||||
var line string
|
line := strings.TrimSpace(scanner.Text())
|
||||||
if line, err = bufin.ReadString('\n'); err != nil {
|
|
||||||
if err != io.EOF {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
done = true
|
|
||||||
}
|
|
||||||
line = strings.TrimSpace(line)
|
|
||||||
if len(line) == 0 {
|
if len(line) == 0 {
|
||||||
// Skip blank lines
|
// Skip blank lines
|
||||||
continue
|
continue
|
||||||
@ -236,7 +233,7 @@ func readConfig(target string) string {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if groups := assignRegex.FindStringSubmatch(line); groups != nil {
|
if groups := assignRegex.FindStringSubmatch(line); groups != nil {
|
||||||
key, val = strings.TrimSpace(groups[1]), strings.TrimSpace(groups[2])
|
key, val := strings.TrimSpace(groups[1]), strings.TrimSpace(groups[2])
|
||||||
if key == target {
|
if key == target {
|
||||||
return strings.Trim(val, "\"")
|
return strings.Trim(val, "\"")
|
||||||
}
|
}
|
||||||
@ -245,15 +242,17 @@ func readConfig(target string) string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func getSELinuxPolicyRoot() string {
|
|
||||||
return filepath.Join(selinuxDir, readConfig(selinuxTypeTag))
|
|
||||||
}
|
|
||||||
|
|
||||||
func isProcHandle(fh *os.File) error {
|
func isProcHandle(fh *os.File) error {
|
||||||
var buf unix.Statfs_t
|
var buf unix.Statfs_t
|
||||||
err := unix.Fstatfs(int(fh.Fd()), &buf)
|
|
||||||
if err != nil {
|
for {
|
||||||
return errors.Wrapf(err, "statfs(%q) failed", fh.Name())
|
err := unix.Fstatfs(int(fh.Fd()), &buf)
|
||||||
|
if err == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != unix.EINTR {
|
||||||
|
return errors.Wrapf(err, "statfs(%q) failed", fh.Name())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if buf.Type != unix.PROC_SUPER_MAGIC {
|
if buf.Type != unix.PROC_SUPER_MAGIC {
|
||||||
return errors.Errorf("file %q is not on procfs", fh.Name())
|
return errors.Errorf("file %q is not on procfs", fh.Name())
|
||||||
@ -307,9 +306,16 @@ func setFileLabel(fpath string, label string) error {
|
|||||||
if fpath == "" {
|
if fpath == "" {
|
||||||
return ErrEmptyPath
|
return ErrEmptyPath
|
||||||
}
|
}
|
||||||
if err := unix.Lsetxattr(fpath, xattrNameSelinux, []byte(label), 0); err != nil {
|
for {
|
||||||
return errors.Wrapf(err, "failed to set file label on %s", fpath)
|
err := unix.Lsetxattr(fpath, xattrNameSelinux, []byte(label), 0)
|
||||||
|
if err == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != unix.EINTR {
|
||||||
|
return errors.Wrapf(err, "failed to set file label on %s", fpath)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -751,7 +757,7 @@ func reserveLabel(label string) {
|
|||||||
if len(label) != 0 {
|
if len(label) != 0 {
|
||||||
con := strings.SplitN(label, ":", 4)
|
con := strings.SplitN(label, ":", 4)
|
||||||
if len(con) > 3 {
|
if len(con) > 3 {
|
||||||
mcsAdd(con[3])
|
_ = mcsAdd(con[3])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -828,11 +834,11 @@ func intToMcs(id int, catRange uint32) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for ORD > TIER {
|
for ORD > TIER {
|
||||||
ORD = ORD - TIER
|
ORD -= TIER
|
||||||
TIER--
|
TIER--
|
||||||
}
|
}
|
||||||
TIER = SETSIZE - TIER
|
TIER = SETSIZE - TIER
|
||||||
ORD = ORD + TIER
|
ORD += TIER
|
||||||
return fmt.Sprintf("s0:c%d,c%d", TIER, ORD)
|
return fmt.Sprintf("s0:c%d,c%d", TIER, ORD)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -844,16 +850,14 @@ func uniqMcs(catRange uint32) string {
|
|||||||
)
|
)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
binary.Read(rand.Reader, binary.LittleEndian, &n)
|
_ = binary.Read(rand.Reader, binary.LittleEndian, &n)
|
||||||
c1 = n % catRange
|
c1 = n % catRange
|
||||||
binary.Read(rand.Reader, binary.LittleEndian, &n)
|
_ = binary.Read(rand.Reader, binary.LittleEndian, &n)
|
||||||
c2 = n % catRange
|
c2 = n % catRange
|
||||||
if c1 == c2 {
|
if c1 == c2 {
|
||||||
continue
|
continue
|
||||||
} else {
|
} else if c1 > c2 {
|
||||||
if c1 > c2 {
|
c1, c2 = c2, c1
|
||||||
c1, c2 = c2, c1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
mcs = fmt.Sprintf("s0:c%d,c%d", c1, c2)
|
mcs = fmt.Sprintf("s0:c%d,c%d", c1, c2)
|
||||||
if err := mcsAdd(mcs); err != nil {
|
if err := mcsAdd(mcs); err != nil {
|
||||||
@ -884,18 +888,13 @@ func openContextFile() (*os.File, error) {
|
|||||||
if f, err := os.Open(contextFile); err == nil {
|
if f, err := os.Open(contextFile); err == nil {
|
||||||
return f, nil
|
return f, nil
|
||||||
}
|
}
|
||||||
lxcPath := filepath.Join(getSELinuxPolicyRoot(), "/contexts/lxc_contexts")
|
lxcPath := filepath.Join(policyRoot, "/contexts/lxc_contexts")
|
||||||
return os.Open(lxcPath)
|
return os.Open(lxcPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
var labels = loadLabels()
|
var labels = loadLabels()
|
||||||
|
|
||||||
func loadLabels() map[string]string {
|
func loadLabels() map[string]string {
|
||||||
var (
|
|
||||||
val, key string
|
|
||||||
bufin *bufio.Reader
|
|
||||||
)
|
|
||||||
|
|
||||||
labels := make(map[string]string)
|
labels := make(map[string]string)
|
||||||
in, err := openContextFile()
|
in, err := openContextFile()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -903,18 +902,10 @@ func loadLabels() map[string]string {
|
|||||||
}
|
}
|
||||||
defer in.Close()
|
defer in.Close()
|
||||||
|
|
||||||
bufin = bufio.NewReader(in)
|
scanner := bufio.NewScanner(in)
|
||||||
|
|
||||||
for done := false; !done; {
|
for scanner.Scan() {
|
||||||
var line string
|
line := strings.TrimSpace(scanner.Text())
|
||||||
if line, err = bufin.ReadString('\n'); err != nil {
|
|
||||||
if err == io.EOF {
|
|
||||||
done = true
|
|
||||||
} else {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
line = strings.TrimSpace(line)
|
|
||||||
if len(line) == 0 {
|
if len(line) == 0 {
|
||||||
// Skip blank lines
|
// Skip blank lines
|
||||||
continue
|
continue
|
||||||
@ -924,7 +915,7 @@ func loadLabels() map[string]string {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if groups := assignRegex.FindStringSubmatch(line); groups != nil {
|
if groups := assignRegex.FindStringSubmatch(line); groups != nil {
|
||||||
key, val = strings.TrimSpace(groups[1]), strings.TrimSpace(groups[2])
|
key, val := strings.TrimSpace(groups[1]), strings.TrimSpace(groups[2])
|
||||||
labels[key] = strings.Trim(val, "\"")
|
labels[key] = strings.Trim(val, "\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1015,7 +1006,7 @@ func copyLevel(src, dest string) (string, error) {
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
mcsDelete(tcon["level"])
|
mcsDelete(tcon["level"])
|
||||||
mcsAdd(scon["level"])
|
_ = mcsAdd(scon["level"])
|
||||||
tcon["level"] = scon["level"]
|
tcon["level"] = scon["level"]
|
||||||
return tcon.Get(), nil
|
return tcon.Get(), nil
|
||||||
}
|
}
|
||||||
@ -1095,3 +1086,124 @@ func dupSecOpt(src string) ([]string, error) {
|
|||||||
func disableSecOpt() []string {
|
func disableSecOpt() []string {
|
||||||
return []string{"disable"}
|
return []string{"disable"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// findUserInContext scans the reader for a valid SELinux context
|
||||||
|
// match that is verified with the verifier. Invalid contexts are
|
||||||
|
// skipped. It returns a matched context or an empty string if no
|
||||||
|
// match is found. If a scanner error occurs, it is returned.
|
||||||
|
func findUserInContext(context Context, r io.Reader, verifier func(string) error) (string, error) {
|
||||||
|
fromRole := context["role"]
|
||||||
|
fromType := context["type"]
|
||||||
|
scanner := bufio.NewScanner(r)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
fromConns := strings.Fields(scanner.Text())
|
||||||
|
if len(fromConns) == 0 {
|
||||||
|
// Skip blank lines
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
line := fromConns[0]
|
||||||
|
|
||||||
|
if line[0] == ';' || line[0] == '#' {
|
||||||
|
// Skip comments
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// user context files contexts are formatted as
|
||||||
|
// role_r:type_t:s0 where the user is missing.
|
||||||
|
lineArr := strings.SplitN(line, ":", 4)
|
||||||
|
// skip context with typo, or role and type do not match
|
||||||
|
if len(lineArr) != 3 ||
|
||||||
|
lineArr[0] != fromRole ||
|
||||||
|
lineArr[1] != fromType {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, cc := range fromConns[1:] {
|
||||||
|
toConns := strings.SplitN(cc, ":", 4)
|
||||||
|
if len(toConns) != 3 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
context["role"] = toConns[0]
|
||||||
|
context["type"] = toConns[1]
|
||||||
|
|
||||||
|
outConn := context.get()
|
||||||
|
if err := verifier(outConn); err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
return outConn, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
return "", errors.Wrap(err, "failed to scan for context")
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getDefaultContextFromReaders(c *defaultSECtx) (string, error) {
|
||||||
|
if c.verifier == nil {
|
||||||
|
return "", ErrVerifierNil
|
||||||
|
}
|
||||||
|
|
||||||
|
context, err := newContext(c.scon)
|
||||||
|
if err != nil {
|
||||||
|
return "", errors.Wrapf(err, "failed to create label for %s", c.scon)
|
||||||
|
}
|
||||||
|
|
||||||
|
// set so the verifier validates the matched context with the provided user and level.
|
||||||
|
context["user"] = c.user
|
||||||
|
context["level"] = c.level
|
||||||
|
|
||||||
|
conn, err := findUserInContext(context, c.userRdr, c.verifier)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if conn != "" {
|
||||||
|
return conn, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
conn, err = findUserInContext(context, c.defaultRdr, c.verifier)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if conn != "" {
|
||||||
|
return conn, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", errors.Wrapf(ErrContextMissing, "context not found: %q", c.scon)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getDefaultContextWithLevel(user, level, scon string) (string, error) {
|
||||||
|
userPath := filepath.Join(policyRoot, selinuxUsersDir, user)
|
||||||
|
defaultPath := filepath.Join(policyRoot, defaultContexts)
|
||||||
|
|
||||||
|
fu, err := os.Open(userPath)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
defer fu.Close()
|
||||||
|
|
||||||
|
fd, err := os.Open(defaultPath)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
defer fd.Close()
|
||||||
|
|
||||||
|
c := defaultSECtx{
|
||||||
|
user: user,
|
||||||
|
level: level,
|
||||||
|
scon: scon,
|
||||||
|
userRdr: fu,
|
||||||
|
defaultRdr: fd,
|
||||||
|
verifier: securityCheckContext,
|
||||||
|
}
|
||||||
|
|
||||||
|
return getDefaultContextFromReaders(&c)
|
||||||
|
}
|
||||||
|
6
vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go
generated
vendored
6
vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
// +build !selinux !linux
|
// +build !linux
|
||||||
|
|
||||||
package selinux
|
package selinux
|
||||||
|
|
||||||
@ -146,3 +146,7 @@ func dupSecOpt(src string) ([]string, error) {
|
|||||||
func disableSecOpt() []string {
|
func disableSecOpt() []string {
|
||||||
return []string{"disable"}
|
return []string{"disable"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getDefaultContextWithLevel(user, level, scon string) (string, error) {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
30
vendor/github.com/opencontainers/selinux/go-selinux/xattrs.go
generated
vendored
30
vendor/github.com/opencontainers/selinux/go-selinux/xattrs.go
generated
vendored
@ -1,30 +0,0 @@
|
|||||||
// +build selinux,linux
|
|
||||||
|
|
||||||
package selinux
|
|
||||||
|
|
||||||
import (
|
|
||||||
"golang.org/x/sys/unix"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Returns a []byte slice if the xattr is set and nil otherwise
|
|
||||||
// Requires path and its attribute as arguments
|
|
||||||
func lgetxattr(path string, attr string) ([]byte, error) {
|
|
||||||
// Start with a 128 length byte array
|
|
||||||
dest := make([]byte, 128)
|
|
||||||
sz, errno := unix.Lgetxattr(path, attr, dest)
|
|
||||||
for errno == unix.ERANGE {
|
|
||||||
// Buffer too small, use zero-sized buffer to get the actual size
|
|
||||||
sz, errno = unix.Lgetxattr(path, attr, []byte{})
|
|
||||||
if errno != nil {
|
|
||||||
return nil, errno
|
|
||||||
}
|
|
||||||
|
|
||||||
dest = make([]byte, sz)
|
|
||||||
sz, errno = unix.Lgetxattr(path, attr, dest)
|
|
||||||
}
|
|
||||||
if errno != nil {
|
|
||||||
return nil, errno
|
|
||||||
}
|
|
||||||
|
|
||||||
return dest[:sz], nil
|
|
||||||
}
|
|
38
vendor/github.com/opencontainers/selinux/go-selinux/xattrs_linux.go
generated
vendored
Normal file
38
vendor/github.com/opencontainers/selinux/go-selinux/xattrs_linux.go
generated
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package selinux
|
||||||
|
|
||||||
|
import (
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
)
|
||||||
|
|
||||||
|
// lgetxattr returns a []byte slice containing the value of
|
||||||
|
// an extended attribute attr set for path.
|
||||||
|
func lgetxattr(path, attr string) ([]byte, error) {
|
||||||
|
// Start with a 128 length byte array
|
||||||
|
dest := make([]byte, 128)
|
||||||
|
sz, errno := doLgetxattr(path, attr, dest)
|
||||||
|
for errno == unix.ERANGE {
|
||||||
|
// Buffer too small, use zero-sized buffer to get the actual size
|
||||||
|
sz, errno = doLgetxattr(path, attr, []byte{})
|
||||||
|
if errno != nil {
|
||||||
|
return nil, errno
|
||||||
|
}
|
||||||
|
|
||||||
|
dest = make([]byte, sz)
|
||||||
|
sz, errno = doLgetxattr(path, attr, dest)
|
||||||
|
}
|
||||||
|
if errno != nil {
|
||||||
|
return nil, errno
|
||||||
|
}
|
||||||
|
|
||||||
|
return dest[:sz], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// doLgetxattr is a wrapper that retries on EINTR
|
||||||
|
func doLgetxattr(path, attr string, dest []byte) (int, error) {
|
||||||
|
for {
|
||||||
|
sz, err := unix.Lgetxattr(path, attr, dest)
|
||||||
|
if err != unix.EINTR {
|
||||||
|
return sz, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
17
vendor/github.com/opencontainers/selinux/pkg/pwalk/pwalk.go
generated
vendored
17
vendor/github.com/opencontainers/selinux/pkg/pwalk/pwalk.go
generated
vendored
@ -20,17 +20,16 @@ type WalkFunc = filepath.WalkFunc
|
|||||||
//
|
//
|
||||||
// Note that this implementation only supports primitive error handling:
|
// Note that this implementation only supports primitive error handling:
|
||||||
//
|
//
|
||||||
// * no errors are ever passed to WalkFn
|
// - no errors are ever passed to WalkFn;
|
||||||
//
|
//
|
||||||
// * once a walkFn returns any error, all further processing stops
|
// - once a walkFn returns any error, all further processing stops
|
||||||
// and the error is returned to the caller of Walk;
|
// and the error is returned to the caller of Walk;
|
||||||
//
|
//
|
||||||
// * filepath.SkipDir is not supported;
|
// - filepath.SkipDir is not supported;
|
||||||
//
|
|
||||||
// * if more than one walkFn instance will return an error, only one
|
|
||||||
// of such errors will be propagated and returned by Walk, others
|
|
||||||
// will be silently discarded.
|
|
||||||
//
|
//
|
||||||
|
// - if more than one walkFn instance will return an error, only one
|
||||||
|
// of such errors will be propagated and returned by Walk, others
|
||||||
|
// will be silently discarded.
|
||||||
func Walk(root string, walkFn WalkFunc) error {
|
func Walk(root string, walkFn WalkFunc) error {
|
||||||
return WalkN(root, walkFn, runtime.NumCPU()*2)
|
return WalkN(root, walkFn, runtime.NumCPU()*2)
|
||||||
}
|
}
|
||||||
@ -38,6 +37,8 @@ func Walk(root string, walkFn WalkFunc) error {
|
|||||||
// WalkN is a wrapper for filepath.Walk which can call multiple walkFn
|
// WalkN is a wrapper for filepath.Walk which can call multiple walkFn
|
||||||
// in parallel, allowing to handle each item concurrently. A maximum of
|
// in parallel, allowing to handle each item concurrently. A maximum of
|
||||||
// num walkFn will be called at any one time.
|
// num walkFn will be called at any one time.
|
||||||
|
//
|
||||||
|
// Please see Walk documentation for caveats of using this function.
|
||||||
func WalkN(root string, walkFn WalkFunc, num int) error {
|
func WalkN(root string, walkFn WalkFunc, num int) error {
|
||||||
// make sure limit is sensible
|
// make sure limit is sensible
|
||||||
if num < 1 {
|
if num < 1 {
|
||||||
|
191
vendor/github.com/willf/bitset/Makefile
generated
vendored
191
vendor/github.com/willf/bitset/Makefile
generated
vendored
@ -1,191 +0,0 @@
|
|||||||
# MAKEFILE
|
|
||||||
#
|
|
||||||
# @author Nicola Asuni <info@tecnick.com>
|
|
||||||
# @link https://github.com/willf/bitset
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# List special make targets that are not associated with files
|
|
||||||
.PHONY: help all test format fmtcheck vet lint coverage cyclo ineffassign misspell structcheck varcheck errcheck gosimple astscan qa deps clean nuke
|
|
||||||
|
|
||||||
# Use bash as shell (Note: Ubuntu now uses dash which doesn't support PIPESTATUS).
|
|
||||||
SHELL=/bin/bash
|
|
||||||
|
|
||||||
# CVS path (path to the parent dir containing the project)
|
|
||||||
CVSPATH=github.com/willf
|
|
||||||
|
|
||||||
# Project owner
|
|
||||||
OWNER=willf
|
|
||||||
|
|
||||||
# Project vendor
|
|
||||||
VENDOR=willf
|
|
||||||
|
|
||||||
# Project name
|
|
||||||
PROJECT=bitset
|
|
||||||
|
|
||||||
# Project version
|
|
||||||
VERSION=$(shell cat VERSION)
|
|
||||||
|
|
||||||
# Name of RPM or DEB package
|
|
||||||
PKGNAME=${VENDOR}-${PROJECT}
|
|
||||||
|
|
||||||
# Current directory
|
|
||||||
CURRENTDIR=$(shell pwd)
|
|
||||||
|
|
||||||
# GO lang path
|
|
||||||
ifneq ($(GOPATH),)
|
|
||||||
ifeq ($(findstring $(GOPATH),$(CURRENTDIR)),)
|
|
||||||
# the defined GOPATH is not valid
|
|
||||||
GOPATH=
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(GOPATH),)
|
|
||||||
# extract the GOPATH
|
|
||||||
GOPATH=$(firstword $(subst /src/, ,$(CURRENTDIR)))
|
|
||||||
endif
|
|
||||||
|
|
||||||
# --- MAKE TARGETS ---
|
|
||||||
|
|
||||||
# Display general help about this command
|
|
||||||
help:
|
|
||||||
@echo ""
|
|
||||||
@echo "$(PROJECT) Makefile."
|
|
||||||
@echo "GOPATH=$(GOPATH)"
|
|
||||||
@echo "The following commands are available:"
|
|
||||||
@echo ""
|
|
||||||
@echo " make qa : Run all the tests"
|
|
||||||
@echo " make test : Run the unit tests"
|
|
||||||
@echo ""
|
|
||||||
@echo " make format : Format the source code"
|
|
||||||
@echo " make fmtcheck : Check if the source code has been formatted"
|
|
||||||
@echo " make vet : Check for suspicious constructs"
|
|
||||||
@echo " make lint : Check for style errors"
|
|
||||||
@echo " make coverage : Generate the coverage report"
|
|
||||||
@echo " make cyclo : Generate the cyclomatic complexity report"
|
|
||||||
@echo " make ineffassign : Detect ineffectual assignments"
|
|
||||||
@echo " make misspell : Detect commonly misspelled words in source files"
|
|
||||||
@echo " make structcheck : Find unused struct fields"
|
|
||||||
@echo " make varcheck : Find unused global variables and constants"
|
|
||||||
@echo " make errcheck : Check that error return values are used"
|
|
||||||
@echo " make gosimple : Suggest code simplifications"
|
|
||||||
@echo " make astscan : GO AST scanner"
|
|
||||||
@echo ""
|
|
||||||
@echo " make docs : Generate source code documentation"
|
|
||||||
@echo ""
|
|
||||||
@echo " make deps : Get the dependencies"
|
|
||||||
@echo " make clean : Remove any build artifact"
|
|
||||||
@echo " make nuke : Deletes any intermediate file"
|
|
||||||
@echo ""
|
|
||||||
|
|
||||||
# Alias for help target
|
|
||||||
all: help
|
|
||||||
|
|
||||||
# Run the unit tests
|
|
||||||
test:
|
|
||||||
@mkdir -p target/test
|
|
||||||
@mkdir -p target/report
|
|
||||||
GOPATH=$(GOPATH) \
|
|
||||||
go test \
|
|
||||||
-covermode=atomic \
|
|
||||||
-bench=. \
|
|
||||||
-race \
|
|
||||||
-cpuprofile=target/report/cpu.out \
|
|
||||||
-memprofile=target/report/mem.out \
|
|
||||||
-mutexprofile=target/report/mutex.out \
|
|
||||||
-coverprofile=target/report/coverage.out \
|
|
||||||
-v ./... | \
|
|
||||||
tee >(PATH=$(GOPATH)/bin:$(PATH) go-junit-report > target/test/report.xml); \
|
|
||||||
test $${PIPESTATUS[0]} -eq 0
|
|
||||||
|
|
||||||
# Format the source code
|
|
||||||
format:
|
|
||||||
@find . -type f -name "*.go" -exec gofmt -s -w {} \;
|
|
||||||
|
|
||||||
# Check if the source code has been formatted
|
|
||||||
fmtcheck:
|
|
||||||
@mkdir -p target
|
|
||||||
@find . -type f -name "*.go" -exec gofmt -s -d {} \; | tee target/format.diff
|
|
||||||
@test ! -s target/format.diff || { echo "ERROR: the source code has not been formatted - please use 'make format' or 'gofmt'"; exit 1; }
|
|
||||||
|
|
||||||
# Check for syntax errors
|
|
||||||
vet:
|
|
||||||
GOPATH=$(GOPATH) go vet .
|
|
||||||
|
|
||||||
# Check for style errors
|
|
||||||
lint:
|
|
||||||
GOPATH=$(GOPATH) PATH=$(GOPATH)/bin:$(PATH) golint .
|
|
||||||
|
|
||||||
# Generate the coverage report
|
|
||||||
coverage:
|
|
||||||
@mkdir -p target/report
|
|
||||||
GOPATH=$(GOPATH) \
|
|
||||||
go tool cover -html=target/report/coverage.out -o target/report/coverage.html
|
|
||||||
|
|
||||||
# Report cyclomatic complexity
|
|
||||||
cyclo:
|
|
||||||
@mkdir -p target/report
|
|
||||||
GOPATH=$(GOPATH) gocyclo -avg ./ | tee target/report/cyclo.txt ; test $${PIPESTATUS[0]} -eq 0
|
|
||||||
|
|
||||||
# Detect ineffectual assignments
|
|
||||||
ineffassign:
|
|
||||||
@mkdir -p target/report
|
|
||||||
GOPATH=$(GOPATH) ineffassign ./ | tee target/report/ineffassign.txt ; test $${PIPESTATUS[0]} -eq 0
|
|
||||||
|
|
||||||
# Detect commonly misspelled words in source files
|
|
||||||
misspell:
|
|
||||||
@mkdir -p target/report
|
|
||||||
GOPATH=$(GOPATH) misspell -error ./ | tee target/report/misspell.txt ; test $${PIPESTATUS[0]} -eq 0
|
|
||||||
|
|
||||||
# Find unused struct fields
|
|
||||||
structcheck:
|
|
||||||
@mkdir -p target/report
|
|
||||||
GOPATH=$(GOPATH) structcheck -a ./ | tee target/report/structcheck.txt
|
|
||||||
|
|
||||||
# Find unused global variables and constants
|
|
||||||
varcheck:
|
|
||||||
@mkdir -p target/report
|
|
||||||
GOPATH=$(GOPATH) varcheck -e ./ | tee target/report/varcheck.txt
|
|
||||||
|
|
||||||
# Check that error return values are used
|
|
||||||
errcheck:
|
|
||||||
@mkdir -p target/report
|
|
||||||
GOPATH=$(GOPATH) errcheck ./ | tee target/report/errcheck.txt
|
|
||||||
|
|
||||||
# AST scanner
|
|
||||||
astscan:
|
|
||||||
@mkdir -p target/report
|
|
||||||
GOPATH=$(GOPATH) gosec . | tee target/report/astscan.txt ; test $${PIPESTATUS[0]} -eq 0 || true
|
|
||||||
|
|
||||||
# Generate source docs
|
|
||||||
docs:
|
|
||||||
@mkdir -p target/docs
|
|
||||||
nohup sh -c 'GOPATH=$(GOPATH) godoc -http=127.0.0.1:6060' > target/godoc_server.log 2>&1 &
|
|
||||||
wget --directory-prefix=target/docs/ --execute robots=off --retry-connrefused --recursive --no-parent --adjust-extension --page-requisites --convert-links http://127.0.0.1:6060/pkg/github.com/${VENDOR}/${PROJECT}/ ; kill -9 `lsof -ti :6060`
|
|
||||||
@echo '<html><head><meta http-equiv="refresh" content="0;./127.0.0.1:6060/pkg/'${CVSPATH}'/'${PROJECT}'/index.html"/></head><a href="./127.0.0.1:6060/pkg/'${CVSPATH}'/'${PROJECT}'/index.html">'${PKGNAME}' Documentation ...</a></html>' > target/docs/index.html
|
|
||||||
|
|
||||||
# Alias to run all quality-assurance checks
|
|
||||||
qa: fmtcheck test vet lint coverage cyclo ineffassign misspell structcheck varcheck errcheck gosimple astscan
|
|
||||||
|
|
||||||
# --- INSTALL ---
|
|
||||||
|
|
||||||
# Get the dependencies
|
|
||||||
deps:
|
|
||||||
GOPATH=$(GOPATH) go get ./...
|
|
||||||
GOPATH=$(GOPATH) go get golang.org/x/lint/golint
|
|
||||||
GOPATH=$(GOPATH) go get github.com/jstemmer/go-junit-report
|
|
||||||
GOPATH=$(GOPATH) go get github.com/axw/gocov/gocov
|
|
||||||
GOPATH=$(GOPATH) go get github.com/fzipp/gocyclo
|
|
||||||
GOPATH=$(GOPATH) go get github.com/gordonklaus/ineffassign
|
|
||||||
GOPATH=$(GOPATH) go get github.com/client9/misspell/cmd/misspell
|
|
||||||
GOPATH=$(GOPATH) go get github.com/opennota/check/cmd/structcheck
|
|
||||||
GOPATH=$(GOPATH) go get github.com/opennota/check/cmd/varcheck
|
|
||||||
GOPATH=$(GOPATH) go get github.com/kisielk/errcheck
|
|
||||||
GOPATH=$(GOPATH) go get github.com/securego/gosec/cmd/gosec/...
|
|
||||||
|
|
||||||
# Remove any build artifact
|
|
||||||
clean:
|
|
||||||
GOPATH=$(GOPATH) go clean ./...
|
|
||||||
|
|
||||||
# Deletes any intermediate file
|
|
||||||
nuke:
|
|
||||||
rm -rf ./target
|
|
||||||
GOPATH=$(GOPATH) go clean -i ./...
|
|
20
vendor/github.com/willf/bitset/README.md
generated
vendored
20
vendor/github.com/willf/bitset/README.md
generated
vendored
@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
*Go language library to map between non-negative integers and boolean values*
|
*Go language library to map between non-negative integers and boolean values*
|
||||||
|
|
||||||
[](https://travis-ci.org/willf/bitset?branch=master)
|
[](https://github.com/willf/bitset/actions?query=workflow%3ATest)
|
||||||
[](https://coveralls.io/github/willf/bitset?branch=master)
|
[](https://coveralls.io/github/willf/bitset?branch=master)
|
||||||
[](https://goreportcard.com/report/github.com/willf/bitset)
|
[](https://goreportcard.com/report/github.com/willf/bitset)
|
||||||
[](http://godoc.org/github.com/willf/bitset)
|
[](https://pkg.go.dev/github.com/willf/bitset?tab=doc)
|
||||||
|
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
@ -63,8 +63,11 @@ func main() {
|
|||||||
|
|
||||||
As an alternative to BitSets, one should check out the 'big' package, which provides a (less set-theoretical) view of bitsets.
|
As an alternative to BitSets, one should check out the 'big' package, which provides a (less set-theoretical) view of bitsets.
|
||||||
|
|
||||||
Godoc documentation is at: https://godoc.org/github.com/willf/bitset
|
Package documentation is at: https://pkg.go.dev/github.com/willf/bitset?tab=doc
|
||||||
|
|
||||||
|
## Memory Usage
|
||||||
|
|
||||||
|
The memory usage of a bitset using N bits is at least N/8 bytes. The number of bits in a bitset is at least as large as one plus the greatest bit index you have accessed. Thus it is possible to run out of memory while using a bitset. If you have lots of bits, you might prefer compressed bitsets, like the [Roaring bitmaps](http://roaringbitmap.org) and its [Go implementation](https://github.com/RoaringBitmap/roaring).
|
||||||
|
|
||||||
## Implementation Note
|
## Implementation Note
|
||||||
|
|
||||||
@ -82,15 +85,10 @@ go get github.com/willf/bitset
|
|||||||
|
|
||||||
If you wish to contribute to this project, please branch and issue a pull request against master ("[GitHub Flow](https://guides.github.com/introduction/flow/)")
|
If you wish to contribute to this project, please branch and issue a pull request against master ("[GitHub Flow](https://guides.github.com/introduction/flow/)")
|
||||||
|
|
||||||
This project include a Makefile that allows you to test and build the project with simple commands.
|
|
||||||
To see all available options:
|
|
||||||
```bash
|
|
||||||
make help
|
|
||||||
```
|
|
||||||
|
|
||||||
## Running all tests
|
## Running all tests
|
||||||
|
|
||||||
Before committing the code, please check if it passes all tests using (note: this will install some dependencies):
|
Before committing the code, please check if it passes tests, has adequate coverage, etc.
|
||||||
```bash
|
```bash
|
||||||
make qa
|
go test
|
||||||
|
go test -cover
|
||||||
```
|
```
|
||||||
|
72
vendor/github.com/willf/bitset/bitset.go
generated
vendored
72
vendor/github.com/willf/bitset/bitset.go
generated
vendored
@ -138,6 +138,9 @@ func (b *BitSet) Len() uint {
|
|||||||
// extendSetMaybe adds additional words to incorporate new bits if needed
|
// extendSetMaybe adds additional words to incorporate new bits if needed
|
||||||
func (b *BitSet) extendSetMaybe(i uint) {
|
func (b *BitSet) extendSetMaybe(i uint) {
|
||||||
if i >= b.length { // if we need more bits, make 'em
|
if i >= b.length { // if we need more bits, make 'em
|
||||||
|
if i >= Cap() {
|
||||||
|
panic("You are exceeding the capacity")
|
||||||
|
}
|
||||||
nsize := wordsNeeded(i + 1)
|
nsize := wordsNeeded(i + 1)
|
||||||
if b.set == nil {
|
if b.set == nil {
|
||||||
b.set = make([]uint64, nsize)
|
b.set = make([]uint64, nsize)
|
||||||
@ -160,7 +163,12 @@ func (b *BitSet) Test(i uint) bool {
|
|||||||
return b.set[i>>log2WordSize]&(1<<(i&(wordSize-1))) != 0
|
return b.set[i>>log2WordSize]&(1<<(i&(wordSize-1))) != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set bit i to 1
|
// Set bit i to 1, the capacity of the bitset is automatically
|
||||||
|
// increased accordingly.
|
||||||
|
// If i>= Cap(), this function will panic.
|
||||||
|
// Warning: using a very large value for 'i'
|
||||||
|
// may lead to a memory shortage and a panic: the caller is responsible
|
||||||
|
// for providing sensible parameters in line with their memory capacity.
|
||||||
func (b *BitSet) Set(i uint) *BitSet {
|
func (b *BitSet) Set(i uint) *BitSet {
|
||||||
b.extendSetMaybe(i)
|
b.extendSetMaybe(i)
|
||||||
b.set[i>>log2WordSize] |= 1 << (i & (wordSize - 1))
|
b.set[i>>log2WordSize] |= 1 << (i & (wordSize - 1))
|
||||||
@ -176,7 +184,11 @@ func (b *BitSet) Clear(i uint) *BitSet {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTo sets bit i to value
|
// SetTo sets bit i to value.
|
||||||
|
// If i>= Cap(), this function will panic.
|
||||||
|
// Warning: using a very large value for 'i'
|
||||||
|
// may lead to a memory shortage and a panic: the caller is responsible
|
||||||
|
// for providing sensible parameters in line with their memory capacity.
|
||||||
func (b *BitSet) SetTo(i uint, value bool) *BitSet {
|
func (b *BitSet) SetTo(i uint, value bool) *BitSet {
|
||||||
if value {
|
if value {
|
||||||
return b.Set(i)
|
return b.Set(i)
|
||||||
@ -184,7 +196,11 @@ func (b *BitSet) SetTo(i uint, value bool) *BitSet {
|
|||||||
return b.Clear(i)
|
return b.Clear(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flip bit at i
|
// Flip bit at i.
|
||||||
|
// If i>= Cap(), this function will panic.
|
||||||
|
// Warning: using a very large value for 'i'
|
||||||
|
// may lead to a memory shortage and a panic: the caller is responsible
|
||||||
|
// for providing sensible parameters in line with their memory capacity.
|
||||||
func (b *BitSet) Flip(i uint) *BitSet {
|
func (b *BitSet) Flip(i uint) *BitSet {
|
||||||
if i >= b.length {
|
if i >= b.length {
|
||||||
return b.Set(i)
|
return b.Set(i)
|
||||||
@ -193,26 +209,51 @@ func (b *BitSet) Flip(i uint) *BitSet {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shrink shrinks BitSet to desired length in bits. It clears all bits > length
|
// Shrink shrinks BitSet so that the provided value is the last possible
|
||||||
// and reduces the size and length of the set.
|
// set value. It clears all bits > the provided index and reduces the size
|
||||||
|
// and length of the set.
|
||||||
|
//
|
||||||
|
// Note that the parameter value is not the new length in bits: it is the
|
||||||
|
// maximal value that can be stored in the bitset after the function call.
|
||||||
|
// The new length in bits is the parameter value + 1. Thus it is not possible
|
||||||
|
// to use this function to set the length to 0, the minimal value of the length
|
||||||
|
// after this function call is 1.
|
||||||
//
|
//
|
||||||
// A new slice is allocated to store the new bits, so you may see an increase in
|
// A new slice is allocated to store the new bits, so you may see an increase in
|
||||||
// memory usage until the GC runs. Normally this should not be a problem, but if you
|
// memory usage until the GC runs. Normally this should not be a problem, but if you
|
||||||
// have an extremely large BitSet its important to understand that the old BitSet will
|
// have an extremely large BitSet its important to understand that the old BitSet will
|
||||||
// remain in memory until the GC frees it.
|
// remain in memory until the GC frees it.
|
||||||
func (b *BitSet) Shrink(length uint) *BitSet {
|
func (b *BitSet) Shrink(lastbitindex uint) *BitSet {
|
||||||
idx := wordsNeeded(length + 1)
|
length := lastbitindex + 1
|
||||||
|
idx := wordsNeeded(length)
|
||||||
if idx > len(b.set) {
|
if idx > len(b.set) {
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
shrunk := make([]uint64, idx)
|
shrunk := make([]uint64, idx)
|
||||||
copy(shrunk, b.set[:idx])
|
copy(shrunk, b.set[:idx])
|
||||||
b.set = shrunk
|
b.set = shrunk
|
||||||
b.length = length + 1
|
b.length = length
|
||||||
b.set[idx-1] &= (allBits >> (uint64(64) - uint64(length&(wordSize-1)) - 1))
|
b.set[idx-1] &= (allBits >> (uint64(64) - uint64(length&(wordSize-1))))
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compact shrinks BitSet to so that we preserve all set bits, while minimizing
|
||||||
|
// memory usage. Compact calls Shrink.
|
||||||
|
func (b *BitSet) Compact() *BitSet {
|
||||||
|
idx := len(b.set) - 1
|
||||||
|
for ; idx >= 0 && b.set[idx] == 0; idx-- {
|
||||||
|
}
|
||||||
|
newlength := uint((idx + 1) << log2WordSize)
|
||||||
|
if newlength >= b.length {
|
||||||
|
return b // nothing to do
|
||||||
|
}
|
||||||
|
if newlength > 0 {
|
||||||
|
return b.Shrink(newlength - 1)
|
||||||
|
}
|
||||||
|
// We preserve one word
|
||||||
|
return b.Shrink(63)
|
||||||
|
}
|
||||||
|
|
||||||
// InsertAt takes an index which indicates where a bit should be
|
// InsertAt takes an index which indicates where a bit should be
|
||||||
// inserted. Then it shifts all the bits in the set to the left by 1, starting
|
// inserted. Then it shifts all the bits in the set to the left by 1, starting
|
||||||
// from the given index position, and sets the index position to 0.
|
// from the given index position, and sets the index position to 0.
|
||||||
@ -323,6 +364,9 @@ func (b *BitSet) DeleteAt(i uint) *BitSet {
|
|||||||
// including possibly the current index
|
// including possibly the current index
|
||||||
// along with an error code (true = valid, false = no set bit found)
|
// along with an error code (true = valid, false = no set bit found)
|
||||||
// for i,e := v.NextSet(0); e; i,e = v.NextSet(i + 1) {...}
|
// for i,e := v.NextSet(0); e; i,e = v.NextSet(i + 1) {...}
|
||||||
|
//
|
||||||
|
// Users concerned with performance may want to use NextSetMany to
|
||||||
|
// retrieve several values at once.
|
||||||
func (b *BitSet) NextSet(i uint) (uint, bool) {
|
func (b *BitSet) NextSet(i uint) (uint, bool) {
|
||||||
x := int(i >> log2WordSize)
|
x := int(i >> log2WordSize)
|
||||||
if x >= len(b.set) {
|
if x >= len(b.set) {
|
||||||
@ -358,6 +402,14 @@ func (b *BitSet) NextSet(i uint) (uint, bool) {
|
|||||||
// j += 1
|
// j += 1
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
|
//
|
||||||
|
// It is possible to retrieve all set bits as follow:
|
||||||
|
//
|
||||||
|
// indices := make([]uint, bitmap.Count())
|
||||||
|
// bitmap.NextSetMany(0, indices)
|
||||||
|
//
|
||||||
|
// However if bitmap.Count() is large, it might be preferable to
|
||||||
|
// use several calls to NextSetMany, for performance reasons.
|
||||||
func (b *BitSet) NextSetMany(i uint, buffer []uint) (uint, []uint) {
|
func (b *BitSet) NextSetMany(i uint, buffer []uint) (uint, []uint) {
|
||||||
myanswer := buffer
|
myanswer := buffer
|
||||||
capacity := cap(buffer)
|
capacity := cap(buffer)
|
||||||
@ -809,7 +861,7 @@ func (b *BitSet) ReadFrom(stream io.Reader) (int64, error) {
|
|||||||
newset := New(uint(length))
|
newset := New(uint(length))
|
||||||
|
|
||||||
if uint64(newset.length) != length {
|
if uint64(newset.length) != length {
|
||||||
return 0, errors.New("Unmarshalling error: type mismatch")
|
return 0, errors.New("unmarshalling error: type mismatch")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read remaining bytes as set
|
// Read remaining bytes as set
|
||||||
|
3
vendor/github.com/willf/bitset/go.mod
generated
vendored
Normal file
3
vendor/github.com/willf/bitset/go.mod
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module github.com/willf/bitset
|
||||||
|
|
||||||
|
go 1.14
|
0
vendor/github.com/willf/bitset/go.sum
generated
vendored
Normal file
0
vendor/github.com/willf/bitset/go.sum
generated
vendored
Normal file
35
vendor/golang.org/x/net/http2/transport.go
generated
vendored
35
vendor/golang.org/x/net/http2/transport.go
generated
vendored
@ -154,12 +154,21 @@ func (t *Transport) pingTimeout() time.Duration {
|
|||||||
|
|
||||||
// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2.
|
// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2.
|
||||||
// It returns an error if t1 has already been HTTP/2-enabled.
|
// It returns an error if t1 has already been HTTP/2-enabled.
|
||||||
|
//
|
||||||
|
// Use ConfigureTransports instead to configure the HTTP/2 Transport.
|
||||||
func ConfigureTransport(t1 *http.Transport) error {
|
func ConfigureTransport(t1 *http.Transport) error {
|
||||||
_, err := configureTransport(t1)
|
_, err := ConfigureTransports(t1)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureTransport(t1 *http.Transport) (*Transport, error) {
|
// ConfigureTransports configures a net/http HTTP/1 Transport to use HTTP/2.
|
||||||
|
// It returns a new HTTP/2 Transport for further configuration.
|
||||||
|
// It returns an error if t1 has already been HTTP/2-enabled.
|
||||||
|
func ConfigureTransports(t1 *http.Transport) (*Transport, error) {
|
||||||
|
return configureTransports(t1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureTransports(t1 *http.Transport) (*Transport, error) {
|
||||||
connPool := new(clientConnPool)
|
connPool := new(clientConnPool)
|
||||||
t2 := &Transport{
|
t2 := &Transport{
|
||||||
ConnPool: noDialClientConnPool{connPool},
|
ConnPool: noDialClientConnPool{connPool},
|
||||||
@ -689,6 +698,7 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro
|
|||||||
cc.inflow.add(transportDefaultConnFlow + initialWindowSize)
|
cc.inflow.add(transportDefaultConnFlow + initialWindowSize)
|
||||||
cc.bw.Flush()
|
cc.bw.Flush()
|
||||||
if cc.werr != nil {
|
if cc.werr != nil {
|
||||||
|
cc.Close()
|
||||||
return nil, cc.werr
|
return nil, cc.werr
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1080,6 +1090,15 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf
|
|||||||
bodyWriter := cc.t.getBodyWriterState(cs, body)
|
bodyWriter := cc.t.getBodyWriterState(cs, body)
|
||||||
cs.on100 = bodyWriter.on100
|
cs.on100 = bodyWriter.on100
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
cc.wmu.Lock()
|
||||||
|
werr := cc.werr
|
||||||
|
cc.wmu.Unlock()
|
||||||
|
if werr != nil {
|
||||||
|
cc.Close()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
cc.wmu.Lock()
|
cc.wmu.Lock()
|
||||||
endStream := !hasBody && !hasTrailers
|
endStream := !hasBody && !hasTrailers
|
||||||
werr := cc.writeHeaders(cs.ID, endStream, int(cc.maxFrameSize), hdrs)
|
werr := cc.writeHeaders(cs.ID, endStream, int(cc.maxFrameSize), hdrs)
|
||||||
@ -1129,6 +1148,9 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf
|
|||||||
// we can keep it.
|
// we can keep it.
|
||||||
bodyWriter.cancel()
|
bodyWriter.cancel()
|
||||||
cs.abortRequestBodyWrite(errStopReqBodyWrite)
|
cs.abortRequestBodyWrite(errStopReqBodyWrite)
|
||||||
|
if hasBody && !bodyWritten {
|
||||||
|
<-bodyWriter.resc
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if re.err != nil {
|
if re.err != nil {
|
||||||
cc.forgetStreamID(cs.ID)
|
cc.forgetStreamID(cs.ID)
|
||||||
@ -1149,6 +1171,7 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf
|
|||||||
} else {
|
} else {
|
||||||
bodyWriter.cancel()
|
bodyWriter.cancel()
|
||||||
cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel)
|
cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel)
|
||||||
|
<-bodyWriter.resc
|
||||||
}
|
}
|
||||||
cc.forgetStreamID(cs.ID)
|
cc.forgetStreamID(cs.ID)
|
||||||
return nil, cs.getStartedWrite(), errTimeout
|
return nil, cs.getStartedWrite(), errTimeout
|
||||||
@ -1158,6 +1181,7 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf
|
|||||||
} else {
|
} else {
|
||||||
bodyWriter.cancel()
|
bodyWriter.cancel()
|
||||||
cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel)
|
cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel)
|
||||||
|
<-bodyWriter.resc
|
||||||
}
|
}
|
||||||
cc.forgetStreamID(cs.ID)
|
cc.forgetStreamID(cs.ID)
|
||||||
return nil, cs.getStartedWrite(), ctx.Err()
|
return nil, cs.getStartedWrite(), ctx.Err()
|
||||||
@ -1167,6 +1191,7 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf
|
|||||||
} else {
|
} else {
|
||||||
bodyWriter.cancel()
|
bodyWriter.cancel()
|
||||||
cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel)
|
cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel)
|
||||||
|
<-bodyWriter.resc
|
||||||
}
|
}
|
||||||
cc.forgetStreamID(cs.ID)
|
cc.forgetStreamID(cs.ID)
|
||||||
return nil, cs.getStartedWrite(), errRequestCanceled
|
return nil, cs.getStartedWrite(), errRequestCanceled
|
||||||
@ -1176,6 +1201,7 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf
|
|||||||
// forgetStreamID.
|
// forgetStreamID.
|
||||||
return nil, cs.getStartedWrite(), cs.resetErr
|
return nil, cs.getStartedWrite(), cs.resetErr
|
||||||
case err := <-bodyWriter.resc:
|
case err := <-bodyWriter.resc:
|
||||||
|
bodyWritten = true
|
||||||
// Prefer the read loop's response, if available. Issue 16102.
|
// Prefer the read loop's response, if available. Issue 16102.
|
||||||
select {
|
select {
|
||||||
case re := <-readLoopResCh:
|
case re := <-readLoopResCh:
|
||||||
@ -1186,7 +1212,6 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf
|
|||||||
cc.forgetStreamID(cs.ID)
|
cc.forgetStreamID(cs.ID)
|
||||||
return nil, cs.getStartedWrite(), err
|
return nil, cs.getStartedWrite(), err
|
||||||
}
|
}
|
||||||
bodyWritten = true
|
|
||||||
if d := cc.responseHeaderTimeout(); d != 0 {
|
if d := cc.responseHeaderTimeout(); d != 0 {
|
||||||
timer := time.NewTimer(d)
|
timer := time.NewTimer(d)
|
||||||
defer timer.Stop()
|
defer timer.Stop()
|
||||||
@ -2607,7 +2632,9 @@ func (t *Transport) getBodyWriterState(cs *clientStream, body io.Reader) (s body
|
|||||||
|
|
||||||
func (s bodyWriterState) cancel() {
|
func (s bodyWriterState) cancel() {
|
||||||
if s.timer != nil {
|
if s.timer != nil {
|
||||||
s.timer.Stop()
|
if s.timer.Stop() {
|
||||||
|
s.resc <- nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
// +build go1.14
|
// +build go1.14,!go1.16
|
||||||
|
|
||||||
package idna
|
package idna
|
||||||
|
|
4839
vendor/golang.org/x/net/idna/tables13.0.0.go
generated
vendored
Normal file
4839
vendor/golang.org/x/net/idna/tables13.0.0.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8
vendor/modules.txt
vendored
8
vendor/modules.txt
vendored
@ -36,7 +36,7 @@ github.com/containerd/cgroups/stats/v1
|
|||||||
github.com/containerd/containerd/errdefs
|
github.com/containerd/containerd/errdefs
|
||||||
github.com/containerd/containerd/log
|
github.com/containerd/containerd/log
|
||||||
github.com/containerd/containerd/platforms
|
github.com/containerd/containerd/platforms
|
||||||
# github.com/containers/common v0.31.0
|
# github.com/containers/common v0.31.1
|
||||||
github.com/containers/common/pkg/auth
|
github.com/containers/common/pkg/auth
|
||||||
github.com/containers/common/pkg/capabilities
|
github.com/containers/common/pkg/capabilities
|
||||||
github.com/containers/common/pkg/completion
|
github.com/containers/common/pkg/completion
|
||||||
@ -248,7 +248,7 @@ github.com/opencontainers/runc/libcontainer/system
|
|||||||
github.com/opencontainers/runc/libcontainer/user
|
github.com/opencontainers/runc/libcontainer/user
|
||||||
# github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6
|
# github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6
|
||||||
github.com/opencontainers/runtime-spec/specs-go
|
github.com/opencontainers/runtime-spec/specs-go
|
||||||
# github.com/opencontainers/selinux v1.6.0
|
# github.com/opencontainers/selinux v1.8.0
|
||||||
github.com/opencontainers/selinux/go-selinux
|
github.com/opencontainers/selinux/go-selinux
|
||||||
github.com/opencontainers/selinux/go-selinux/label
|
github.com/opencontainers/selinux/go-selinux/label
|
||||||
github.com/opencontainers/selinux/pkg/pwalk
|
github.com/opencontainers/selinux/pkg/pwalk
|
||||||
@ -304,7 +304,7 @@ github.com/vbauerster/mpb/v5
|
|||||||
github.com/vbauerster/mpb/v5/cwriter
|
github.com/vbauerster/mpb/v5/cwriter
|
||||||
github.com/vbauerster/mpb/v5/decor
|
github.com/vbauerster/mpb/v5/decor
|
||||||
github.com/vbauerster/mpb/v5/internal
|
github.com/vbauerster/mpb/v5/internal
|
||||||
# github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243
|
# github.com/willf/bitset v1.1.11
|
||||||
github.com/willf/bitset
|
github.com/willf/bitset
|
||||||
# github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b
|
# github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b
|
||||||
github.com/xeipuuv/gojsonpointer
|
github.com/xeipuuv/gojsonpointer
|
||||||
@ -336,7 +336,7 @@ golang.org/x/crypto/openpgp/packet
|
|||||||
golang.org/x/crypto/openpgp/s2k
|
golang.org/x/crypto/openpgp/s2k
|
||||||
golang.org/x/crypto/pbkdf2
|
golang.org/x/crypto/pbkdf2
|
||||||
golang.org/x/crypto/ssh/terminal
|
golang.org/x/crypto/ssh/terminal
|
||||||
# golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0
|
# golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb
|
||||||
golang.org/x/net/context
|
golang.org/x/net/context
|
||||||
golang.org/x/net/http/httpguts
|
golang.org/x/net/http/httpguts
|
||||||
golang.org/x/net/http2
|
golang.org/x/net/http2
|
||||||
|
Loading…
Reference in New Issue
Block a user