Skip to content

Commit ec9f2f3

Browse files
authored
Validate QR2 AVAILABLE requests (#103)
* QR2: Require well-formed AVAILABLE packets * QR2: Prevent crashing on AVAILABLE packet of exactly length 5
1 parent f23a6bf commit ec9f2f3

1 file changed

Lines changed: 16 additions & 3 deletions

File tree

‎qr2/main.go‎

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,13 @@ func StartServer(reload bool) {
104104

105105
buf := make([]byte, 1024)
106106
n, addr, err := conn.ReadFrom(buf)
107-
if err != nil || n == 0 {
107+
if err != nil || n < 5 {
108108
continue
109109
}
110110

111111
waitGroup.Add(1)
112112

113-
go handleConnection(conn, *addr.(*net.UDPAddr), buf)
113+
go handleConnection(conn, *addr.(*net.UDPAddr), buf, n)
114114
}
115115
}()
116116
}
@@ -145,7 +145,7 @@ func Shutdown() {
145145
logging.Notice("QR2", "Saved", aurora.Cyan(len(groups)), "groups")
146146
}
147147

148-
func handleConnection(conn net.PacketConn, addr net.UDPAddr, buffer []byte) {
148+
func handleConnection(conn net.PacketConn, addr net.UDPAddr, buffer []byte, n int) {
149149
defer waitGroup.Done()
150150

151151
packetType := buffer[0]
@@ -224,6 +224,19 @@ func handleConnection(conn net.PacketConn, addr net.UDPAddr, buffer []byte) {
224224
return
225225

226226
case AvailableRequest:
227+
// Expect a null terminated string
228+
if n-1 < 5 || buffer[n-1] != 0 {
229+
return
230+
}
231+
232+
// Only respond if the game name provided in the packet is valid
233+
gameName := string(buffer[5 : n-1])
234+
gameInfo := common.GetGameInfoByName(gameName)
235+
236+
if gameInfo == nil {
237+
return
238+
}
239+
227240
logging.Info("QR2", "Command:", aurora.Yellow("AVAILABLE"))
228241
_, _ = conn.WriteTo(createResponseHeader(AvailableRequest, 0), &addr)
229242
return

0 commit comments

Comments
 (0)