From 44dff728be4707af4f5a9b65de8ce77444d0ec1a Mon Sep 17 00:00:00 2001 From: Paul Holzinger Date: Thu, 23 Jan 2025 19:04:39 +0100 Subject: [PATCH] DNM: vendor my c/common for to test detach.Copy() changes Signed-off-by: Paul Holzinger --- go.mod | 2 + go.sum | 4 +- .../containers/common/pkg/detach/copy.go | 89 ++++++++++++------- vendor/modules.txt | 5 +- 4 files changed, 65 insertions(+), 35 deletions(-) diff --git a/go.mod b/go.mod index 2dad8f180a..804de373be 100644 --- a/go.mod +++ b/go.mod @@ -231,3 +231,5 @@ require ( gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect tags.cncf.io/container-device-interface/specs-go v0.8.0 // indirect ) + +replace github.com/containers/common => github.com/Luap99/common v0.20.3-0.20250123180009-ab34bb7946f2 diff --git a/go.sum b/go.sum index 55c912c7a8..09cf65a1d0 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,8 @@ github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg6 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/Luap99/common v0.20.3-0.20250123180009-ab34bb7946f2 h1:hpr8WPzZHKx2hawm9YDeS18rlqT6dNLrrQpA5xHYA/0= +github.com/Luap99/common v0.20.3-0.20250123180009-ab34bb7946f2/go.mod h1:mWhwkYaWR5bXeOwq3ruzdmH9gaT2pex00C6pd4VXuvM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.12.9 h1:2zJy5KA+l0loz1HzEGqyNnjd3fyZA31ZBCGKacp6lLg= @@ -78,8 +80,6 @@ github.com/containernetworking/plugins v1.5.1 h1:T5ji+LPYjjgW0QM+KyrigZbLsZ8jaX+ github.com/containernetworking/plugins v1.5.1/go.mod h1:MIQfgMayGuHYs0XdNudf31cLLAC+i242hNm6KuDGqCM= github.com/containers/buildah v1.38.1-0.20241119213149-52437ef15d33 h1:Ih6KuyByK7ZGGzkS0M5rVBPLWIyeDvdL5klhsKBo8vA= github.com/containers/buildah v1.38.1-0.20241119213149-52437ef15d33/go.mod h1:RxIuKhwTpRl3ma4d4BF6QzSSeg9zNNvo/xhYJOKeDQs= -github.com/containers/common v0.61.1-0.20250120135258-06628cb958e9 h1:aiup0MIiAi2Xnv15vApAPqgy4/49ZGkYOpevDgGHfxg= -github.com/containers/common v0.61.1-0.20250120135258-06628cb958e9/go.mod h1:1S+/XhAEOwMGePCUqoYYh1iZo9fU1IpuIwVzCCIdBVU= github.com/containers/conmon v2.0.20+incompatible h1:YbCVSFSCqFjjVwHTPINGdMX1F6JXHGTUje2ZYobNrkg= github.com/containers/conmon v2.0.20+incompatible/go.mod h1:hgwZ2mtuDrppv78a/cOBNiCm6O0UMWGx1mu7P00nu5I= github.com/containers/gvisor-tap-vsock v0.8.1 h1:88qkOjGMF9NmyoVG/orUw73mdwj3z4aOwEbRS01hF78= diff --git a/vendor/github.com/containers/common/pkg/detach/copy.go b/vendor/github.com/containers/common/pkg/detach/copy.go index 97a250e444..c413878160 100644 --- a/vendor/github.com/containers/common/pkg/detach/copy.go +++ b/vendor/github.com/containers/common/pkg/detach/copy.go @@ -1,6 +1,7 @@ package detach import ( + "bytes" "errors" "io" ) @@ -11,47 +12,73 @@ var ErrDetach = errors.New("detached from container") // Copy is similar to io.Copy but support a detach key sequence to break out. func Copy(dst io.Writer, src io.Reader, keys []byte) (written int64, err error) { + // if no key sequence we can use the fast std lib implementation + if len(keys) == 0 { + return io.Copy(dst, src) + } buf := make([]byte, 32*1024) + tmpKeyBuf := make([]byte, 0, len(keys)) +outer: for { nr, er := src.Read(buf) - if nr > 0 { - preservBuf := []byte{} - for i, key := range keys { - preservBuf = append(preservBuf, buf[0:nr]...) - if nr != 1 || buf[0] != key { - break - } - if i == len(keys)-1 { - return 0, ErrDetach + + // previous key buffer + if len(tmpKeyBuf) > 0 { + bytesToCheck := min(nr, len(keys)-len(tmpKeyBuf)) + if bytes.Equal(buf[:bytesToCheck], keys[len(tmpKeyBuf):]) { + if len(tmpKeyBuf)+bytesToCheck == len(keys) { + // we are done + return written, ErrDetach } - nr, er = src.Read(buf) - } - var nw int - var ew error - if len(preservBuf) > 0 { - nw, ew = dst.Write(preservBuf) - nr = len(preservBuf) - } else { - nw, ew = dst.Write(buf[0:nr]) - } - if nw > 0 { - written += int64(nw) + tmpKeyBuf = append(tmpKeyBuf, buf[:bytesToCheck]...) + continue outer } + // No match, write buffered keys now + nw, ew := dst.Write(tmpKeyBuf) if ew != nil { - err = ew - break - } - if nr != nw { - err = io.ErrShortWrite - break + return written, ew } + written += int64(nw) + tmpKeyBuf = tmpKeyBuf[:0] } + if er != nil { - if er != io.EOF { - err = er + if er == io.EOF { + return written, nil } - break + return written, err + } + + readMinusKeys := nr - len(keys) + for i := 0; i < readMinusKeys; i++ { + if bytes.Equal(buf[i:i+len(keys)], keys) { + if i > 0 { + nw, ew := dst.Write(buf[:i]) + if ew != nil { + return written, ew + } + written += int64(nw) + } + return written, ErrDetach + } + } + + for i := max(readMinusKeys, 0); i < nr; i++ { + if bytes.Equal(buf[i:nr], keys[:nr-i]) { + nw, ew := dst.Write(buf[:i]) + if ew != nil { + return written, ew + } + written += int64(nw) + tmpKeyBuf = append(tmpKeyBuf, buf[i:nr]...) + continue outer + } + } + + nw, ew := dst.Write(buf[:nr]) + if ew != nil { + return written, ew } + written += int64(nw) } - return written, err } diff --git a/vendor/modules.txt b/vendor/modules.txt index 40c1fc0813..154dbd9e2c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -178,8 +178,8 @@ github.com/containers/buildah/pkg/sshagent github.com/containers/buildah/pkg/util github.com/containers/buildah/pkg/volumes github.com/containers/buildah/util -# github.com/containers/common v0.61.1-0.20250120135258-06628cb958e9 -## explicit; go 1.22.6 +# github.com/containers/common v0.61.1-0.20250120135258-06628cb958e9 => github.com/Luap99/common v0.20.3-0.20250123180009-ab34bb7946f2 +## explicit; go 1.22.8 github.com/containers/common/internal github.com/containers/common/internal/attributedstring github.com/containers/common/libimage @@ -1406,3 +1406,4 @@ tags.cncf.io/container-device-interface/pkg/parser # tags.cncf.io/container-device-interface/specs-go v0.8.0 ## explicit; go 1.19 tags.cncf.io/container-device-interface/specs-go +# github.com/containers/common => github.com/Luap99/common v0.20.3-0.20250123180009-ab34bb7946f2