diff --git a/CHANGELOG.md b/CHANGELOG.md index a055822..250597a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,18 @@ All notable changes to this project will be documented in this file. **ATTN**: This project uses [semantic versioning](http://semver.org/). -## [Unreleased +## [Unreleased] + +## [v1.3.3] - 2022-05-16 +### Fixed +- Added "response from not rcon server" error on auth request (Re fixed panic: runtime error: makeslice: len out of range in rcon.Dial #5). ## [v1.3.2] - 2022-05-16 ### Fixed -- Fixed panic: runtime error: makeslice: len out of range in rcon.Dial #5 +- Fixed panic: runtime error: makeslice: len out of range in rcon.Dial + +### Updated +- Updated golangci linter to 1.42.1 version ## [v1.3.1] - 2021-01-06 ### Updated @@ -78,7 +85,8 @@ changed. ### Added - Initial implementation. -[Unreleased]: https://github.com/gorcon/rcon/compare/v1.3.2...HEAD +[Unreleased]: https://github.com/gorcon/rcon/compare/v1.3.3...HEAD +[v1.3.3]: https://github.com/gorcon/rcon/compare/v1.3.2...v1.3.3 [v1.3.2]: https://github.com/gorcon/rcon/compare/v1.3.1...v1.3.2 [v1.3.1]: https://github.com/gorcon/rcon/compare/v1.3.0...v1.3.1 [v1.3.0]: https://github.com/gorcon/rcon/compare/v1.2.4...v1.3.0 diff --git a/rcon.go b/rcon.go index d9ce3a8..12da156 100644 --- a/rcon.go +++ b/rcon.go @@ -54,6 +54,9 @@ const ( ) var ( + // ErrAuthNotRCON is returned when got auth response with negative size. + ErrAuthNotRCON = errors.New("response from not rcon server") + // ErrInvalidAuthResponse is returned when we didn't get an auth packet // back for second read try after discard empty SERVERDATA_RESPONSE_VALUE // from authentication response. @@ -184,8 +187,8 @@ func (c *Conn) auth(password string) error { } size := response.Size - PacketHeaderSize - if size <= 0 { - size = response.Size + if size < 0 { + return ErrAuthNotRCON } // When the server receives an auth request, it will respond with an empty diff --git a/rcon_test.go b/rcon_test.go index 5e3f61b..b8d62f4 100644 --- a/rcon_test.go +++ b/rcon_test.go @@ -22,7 +22,7 @@ func authHandler(c *rcontest.Context) { case "another": rcon.NewPacket(rcon.SERVERDATA_AUTH_RESPONSE, 42, "").WriteTo(c.Conn()) case "makeslice": - size := int32(len([]byte("")) + int(rcon.PacketPaddingSize)) // Some minecraft servers does not add header size + size := int32(len([]byte(""))) buffer := bytes.NewBuffer(make([]byte, 0, size+4)) @@ -30,12 +30,7 @@ func authHandler(c *rcontest.Context) { _ = binary.Write(buffer, binary.LittleEndian, c.Request().ID) _ = binary.Write(buffer, binary.LittleEndian, rcon.SERVERDATA_RESPONSE_VALUE) - // Write command body, null terminated ASCII string and an empty ASCIIZ string. - buffer.Write(append([]byte(""), 0x00, 0x00)) - buffer.WriteTo(c.Conn()) - - rcon.NewPacket(rcon.SERVERDATA_AUTH_RESPONSE, c.Request().ID, "").WriteTo(c.Conn()) case c.Server().Settings.Password: rcon.NewPacket(rcon.SERVERDATA_RESPONSE_VALUE, c.Request().ID, "").WriteTo(c.Conn()) rcon.NewPacket(rcon.SERVERDATA_AUTH_RESPONSE, c.Request().ID, "").WriteTo(c.Conn()) @@ -135,31 +130,27 @@ func TestDial(t *testing.T) { } }) - t.Run("auth success", func(t *testing.T) { - conn, err := rcon.Dial(server.Addr(), "password") - if err != nil { - t.Errorf("got err %q, want %v", err, nil) - return - } - - conn.Close() - }) - t.Run("makeslice", func(t *testing.T) { server := rcontest.NewServer( rcontest.SetSettings(rcontest.Settings{Password: "makeslice"}), rcontest.SetAuthHandler(authHandler), ) + defer server.Close() - conn, err := rcon.Dial(server.Addr(), "makeslice") + _, err := rcon.Dial(server.Addr(), "makeslice") + if !errors.Is(err, rcon.ErrAuthNotRCON) { + t.Errorf("got err %q, want %q", err, rcon.ErrAuthNotRCON) + } + }) + + t.Run("auth success", func(t *testing.T) { + conn, err := rcon.Dial(server.Addr(), "password") if err != nil { t.Errorf("got err %q, want %v", err, nil) - server.Close() return } conn.Close() - server.Close() }) }