From 847b76921ac1b2129ff09d55f48af335ad3530d7 Mon Sep 17 00:00:00 2001 From: khtsly Date: Thu, 16 Apr 2026 13:17:36 +0700 Subject: [PATCH] chore(xor): shrinks the buffer when it exceed max oversize to prevents huge memory issue --- src/Util/Identifier.luau | 4 ++-- src/Util/Xor.luau | 25 +++++++++++++++++++------ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/Util/Identifier.luau b/src/Util/Identifier.luau index 5cb0076..f781476 100644 --- a/src/Util/Identifier.luau +++ b/src/Util/Identifier.luau @@ -1,8 +1,8 @@ --!optimize 2 --!strict --@EternityDev -local BITS: number = 8 -local MAX_VALUE: number = bit32.lshift(1, BITS) - 1 +const BITS: number = 8 +const MAX_VALUE: number = bit32.lshift(1, BITS) - 1 local hook_fn: (string, number) -> () if not shared.__warp_identifier_registry then diff --git a/src/Util/Xor.luau b/src/Util/Xor.luau index 980a239..c0f6ba8 100644 --- a/src/Util/Xor.luau +++ b/src/Util/Xor.luau @@ -10,17 +10,27 @@ local clientPrev: { [Player]: XorEntry } = {} local clientOutPrev: XorEntry? = nil local clientInPrev: XorEntry? = nil +const MAX_BUFFER_SIZE: number = 1024 -local function xorApply(current: buffer, curLen: number, prev: buffer, prevLen: number): buffer +local function xorApply( + current: buffer, curLen: number, + prev: buffer, prevLen: number +): buffer local out = buffer.create(curLen) local common = if curLen < prevLen then curLen else prevLen local wordEnd = (common // 4) * 4 for off = 0, wordEnd - 4, 4 do - buffer.writeu32(out, off, bit32.bxor(buffer.readu32(current, off), buffer.readu32(prev, off))) + buffer.writeu32( + out, off, + bit32.bxor(buffer.readu32(current, off), buffer.readu32(prev, off)) + ) end for i = wordEnd, common - 1 do - buffer.writeu8(out, i, bit32.bxor(buffer.readu8(current, i), buffer.readu8(prev, i))) + buffer.writeu8( + out, i, + bit32.bxor(buffer.readu8(current, i), buffer.readu8(prev, i)) + ) end if curLen > common then @@ -30,10 +40,13 @@ local function xorApply(current: buffer, curLen: number, prev: buffer, prevLen: end local function storeEntry(entry: XorEntry?, src: buffer, len: number): XorEntry - local e: XorEntry = entry or { buf = buffer.create(len > 64 and len or 64), len = 0 } + local e: XorEntry = entry or { buf = buffer.create(math.max(len, 64)), len = 0 } + local cap = buffer.len(e.buf) - if buffer.len(e.buf) < len then - e.buf = buffer.create(len * 2) + if cap < len then + e.buf = buffer.create(math.min(len * 2, MAX_BUFFER_SIZE + len)) + elseif cap > len * 4 and cap > 128 then + e.buf = buffer.create(math.max(len, 64)) end buffer.copy(e.buf, 0, src, 0, len)