aboutsummaryrefslogtreecommitdiff
path: root/internal/net/conn.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-10-05 17:05:14 -0400
committerhistoria <[not public]>2026-10-05 17:05:14 -0400
commite42952469dadfb3535633c66c881050ac128703c (patch)
treea78f7396b72cdbd6fa4f6c454c830f40cf2ad0cb /internal/net/conn.go
parent90ad8c0c33b519d5830c69d4128bdc984b5e9de8 (diff)
downloadthehouseoficarus-e42952469dadfb3535633c66c881050ac128703c.tar.gz
fix: gather verbs, walk oom, admin path bypass, roulette refund
Diffstat (limited to 'internal/net/conn.go')
-rw-r--r--internal/net/conn.go32
1 files changed, 19 insertions, 13 deletions
diff --git a/internal/net/conn.go b/internal/net/conn.go
index 4aa4db4..ca40354 100644
--- a/internal/net/conn.go
+++ b/internal/net/conn.go
@@ -165,23 +165,29 @@ func stripIAC(s string) string {
i := 0
iacSE := []byte{iac, se}
for i < len(b) {
- if b[i] == iac && i+2 < len(b) {
- if b[i+1] == sb {
- end := bytes.Index(b[i+2:], iacSE)
- if end >= 0 {
- i += end + 4
- continue
- }
- }
- i += 3
+ if b[i] != iac {
+ out = append(out, b[i])
+ i++
continue
}
- if b[i] == iac {
- i++
+ // IAC begins a telnet command. If the line ends mid-command, drop the
+ // remainder: leaking the option byte into player input would corrupt
+ // the command/password with a stray non-UTF-8 byte.
+ if i+1 >= len(b) {
+ break
+ }
+ if b[i+1] == sb {
+ end := bytes.Index(b[i+2:], iacSE)
+ if end < 0 {
+ break
+ }
+ i += end + 4
continue
}
- out = append(out, b[i])
- i++
+ i += 3
+ if i > len(b) {
+ i = len(b)
+ }
}
return string(out)
}