[question] error: RSV1 set, bad opcode 7, bad MASK
jiangbo202 opened this issue · 10 comments
Is there an existing issue for this?
- I have searched the existing issues
Current Behavior
I will follow this example( https://github.com/gorilla/websocket/tree/main/examples/chat )Start the machine locally, then open it through Google Chrome, enter "test" and click send, but it will directly display: Connection closed.
By adding the print on line 70 of the client.go file, log Println ("xxxX:", err)
Result: websocket: RSV1 set, bad opcode 7, bad MASK
I checked #797 , but it worked fine after restarting the computer. However, I have restarted the computer multiple times and it still hasn't worked
I tried other people's computers, and the systems such as Win and Mac Intel chips were all working properly. I also closed all proxy software on my computer, but it didn't work
The error is happening on a MacBook Pro 2021 M1 Pro.
go version: go version go1.20.6 darwin/arm64
Expected Behavior
No response
Steps To Reproduce
No response
Anything else?
No response
Similarly on occasion I am getting:
RSV1 set, RSV2 set, bad opcode 15
panic: runtime error: slice bounds out of range [:4643] with capacity 4096
goroutine 645701 [running]:
bufio.(*Reader).Read(0xc021bbe0c0, {0xc018005ab4?, 0x4c?, 0x1500?})
/root/go/src/bufio/bufio.go:257 +0x2d0
github.com/gorilla/websocket.(*messageReader).Read(0xc000186d50, {0xc018005ab4, 0x4c, 0x4c})
/root/serversrc/server/vendor/github.com/gorilla/websocket/conn.go:1075 +0x1c5
io.ReadAll({0x7f3f11630f20, 0xc000186d50})
/root/go/src/io/io.go:704 +0x7e
github.com/gorilla/websocket.(*Conn).ReadMessage(0x7f3f71fd9a68?)
/root/serversrc/server/vendor/github.com/gorilla/websocket/conn.go:1124 +0x3b
Similar error, happened today.
RSV2 set, RSV3 set, FIN not set on control
panic: runtime error: slice bounds out of range [:5472] with capacity 4096
goroutine 2743107 [running]:
bufio.(*Reader).Read(0xc021f567e0, {0xc000293a04?, 0x4fc?, 0x1000?})
/root/go/src/bufio/bufio.go:257 +0x2d0
github.com/gorilla/websocket.(*messageReader).Read(0xc00013b150, {0xc000293a04, 0x4fc, 0x4fc})
/root/serversrc/server/vendor/github.com/gorilla/websocket/conn.go:1075 +0x1c5
io.ReadAll({0x7fa3e8131498, 0xc00013b150})
/root/go/src/io/io.go:704 +0x7e
github.com/gorilla/websocket.(*Conn).ReadMessage(0xc0179c70e0?)
/root/serversrc/server/vendor/github.com/gorilla/websocket/conn.go:1124 +0x3b
Thank you @GreenMarmot. I am aware of that and both read and writes are guarded with mutexes. I have also ran the application with the go race detector and haven't hit any results pointing in that direction.
But will continue to explore that angle.
Hi where any one able to find any solution to the issue I'm getting a similar error on my M1 machine I've tried running in docker, VM (UTM) Ubuntu server (ARM version) without any success, I've also tried to to reset the MAC to factory without any success. This specific issue seems isolated to M1 since the code works without any issue on m2 also tried using on my AMD cpu and no issues.
Failing Environment
MacBook Pro Apple M1 Sonoma 14.4 16GB Ram
- Go version 1.22.1 (ARM)
- Go version 1.22.1 (AMD64) (Rosseta)
- Docker (ARM)
- Ubuntu 22 server version (ARM) (UTM VM)
- Chrome 122.0.6261.129 (Official Build) (arm64)
- Safari 17.4
Successful environment
- AMD CPU
- INTEL CPU
- MacBook Pro Apple M2 Sonoma 14.4 16GB Ram
Error
RSV1 set, bad opcode 7, bad Mask
- Frametype is set to 7 which crashes in the select loop
Hint
- if Compression is enabled RSV1 disappears
- Attempted other Golang packages fashhttp ,ws all crash
- Python works without any issues
- no proxies installed
- able to send message from server to client
- only crash when client send to server
Solution
For those who get the following error using Apple MacBook: RSV1 set, bad opcode 7, bad Mask when trying to connect from any client within the system can try and disable Content & Privacy that can be found in settings > Screen time > Content & Privacy and then disable Content & Privacy. This solved my issue on my MacBook M1 running Sonoma 14.4.
ps: do disable share across device before disabling to not disable on other devices and then restart the laptop and web filter service should be gone.
Command to view services
sudo lsof -i -P | grep LISTEN
Possible reason
Possible reason is that the WebFilter service was filtering the payload modifying the Frame leading to malformed frames unaware if this is intentional of a bug from apple.
Thank you @Nasar165 , using your method also solved my problem
Happy to be of help @jiangbo202
Got a similar panic, is it concurrent read
your case @canselcik ?
level=error msg="read error: websocket: RSV2 set, RSV3 set, FIN not set on control" file=signal/ws.go line=87 mo
panic: runtime error: slice bounds out of range [:4200] with capacity 4096
goroutine 10353098 [running]:
bufio.(*Reader).Read(0x40015a7740, {0x4000e15fc8?,
/usr/local/go/src/bufio/bufio.go:250 +0x334
github.com/gorilla/websocket.(*messageReader).Read
/go/pkg/mod/github.com/gorilla/websocket@v1.5.
io.ReadAll({0x7f63384600, 0x4002dfa1e0})
/usr/local/go/src/io/io.go:701 +0xe4
io/ioutil.ReadAll(...)
/usr/local/go/src/io/ioutil/ioutil.go:27
github.com/gorilla/websocket.(*Conn).ReadMessage
/go/pkg/mod/github.com/gorilla/websocket@v1.5.
gdcx.com/rtsp2webrtc/signal.(*wsSignal).connectLoop.
/usr/src/myapp/signal/ws.go:85 +0xc0
created by gdcx.com/rtsp2webrtc/signal.(*wsSignal).
/usr/src/myapp/signal/ws.go:81 +0x274
service: Main process exited, code=exited, status=2/
service: Failed with result 'exit-code'.
My logic is quite simple:
for shouldConnect {
for {
connect until success
}
go func() {
for {
// read until error
// panic here
ws.ReadMessage()
send to channel
}
}()
// read from channel
// or wait a specific amount of time, send `KeepAlive` to peer.
for {
}
}
In my case, read/write might be concurrent, but there's only one reader for a connection.
Yes, @tubzby, it was. @GreenMarmot was spot on.
In your case I believe if you changed your code to do something to the spirit of the following, the issue will be addressed:
go func(ws *websocket.Conn) {
for {
// read until error
// panic here
ws.ReadMessage()
send to channel
}
}(ws)
Instead of having your goroutine capture ws
from its scope, pass it a parameter.
@canselcik Thanks for your suggestion, will try that, I'm convinced this was the root cause.