Open
Description
What version of Go are you using (go version
)?
$ go version go version go1.15 linux/amd64
Does this issue reproduce with the latest release?
Haven't tried, but it doesn't look like the code in question has changed.
What operating system and processor architecture are you using (go env
)?
go env
Output
$ go env GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/home/kyle/.cache/go-build" GOENV="/home/kyle/.config/go/env" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/home/kyle/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/home/kyle/" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" GCCGO="gccgo" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/home/kyle/src/klarose/golang/net/go.mod" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build211380463=/tmp/go-build -gno-record-gcc-switches"
What did you do?
While running a webdav server using x/net/webdav, I found that any operations which tried to rename a locked file failed unless the client held a lock on the destination file. This seems wrong.
Reproduction steps:
Compile https://github.com/hacdias/webdav (this uses x/net/webdav as its server).
Run the following:
cd $(mktemp -d)
cat > config.yaml <<EOF
# Server related settings
address: 127.0.0.1
port: 8080
auth: false
tls: false
prefix: /
scope: .
modify: true
rules: []
EOF
webdav -p 8080 --auth=false
Download/build/install/etc cadaver (a simple tool for running webdav commands)
Run cadaver http://localhost:8080
In its command prompt, run the following commands:
A
lock foo.yaml
mv foo.yaml foo.yaml.2
Then run:
B
lock foo.yaml.2
mv foo.yaml foo.yaml.2
What did you expect to see?
A should have succeeded -- foo.yaml
shoud be renamed to foo.yaml.2
:
dav:/> lock foo.yaml
Locking `foo.yaml': succeeded.
dav:/> mv foo.yaml foo.yaml.2
Moving `/foo.yaml' to `/foo.yaml.2': succeeded.
What did you see instead?
A fails, but B succeeds:
dav:/> lock foo.yaml
Locking `foo.yaml': succeeded.
dav:/> mv foo.yaml foo.yaml.2
Moving `/foo.yaml' to `/foo.yaml.2': failed:
412 Precondition Failed
dav:/> lock foo.yaml.2
Locking `foo.yaml.2': succeeded.
dav:/> mv foo.yaml foo.yaml.2
Moving `/foo.yaml' to `/foo.yaml.2': succeeded.
dav:/>