sao: fix erronius length errors

This commit is contained in:
Hay1tsme 2023-11-09 23:37:40 -05:00
parent 44755d4d0f
commit a299ba98ac
2 changed files with 16 additions and 8 deletions

View File

@ -19,9 +19,7 @@ class SaoRequestHeader:
class SaoBaseRequest: class SaoBaseRequest:
def __init__(self, header: SaoRequestHeader, data: bytes) -> None: def __init__(self, header: SaoRequestHeader, data: bytes) -> None:
self.header = header self.header = header
if self.header.data_len != len(data): # TODO: Length check
logging.getLogger('sao').error(f"Expected {self.header.data_len} data bytes byt got {len(data)}!")
# TODO: Raise an error here
class SaoResponseHeader: class SaoResponseHeader:
def __init__(self, cmd_id: int) -> None: def __init__(self, cmd_id: int) -> None:
@ -2047,14 +2045,9 @@ class SaoSynthesizeEnhancementHeroLogRequest(SaoBaseRequest):
self.material_common_reward_user_data_list: List[MaterialCommonRewardUserData] self.material_common_reward_user_data_list: List[MaterialCommonRewardUserData]
if len(data) <= off:
self.material_common_reward_user_data_count = 0
return
self.material_common_reward_user_data_count = decode_int(data, off) self.material_common_reward_user_data_count = decode_int(data, off)
off += INT_OFF off += INT_OFF
for _ in range(self.material_common_reward_user_data_count): for _ in range(self.material_common_reward_user_data_count):
mat = MaterialCommonRewardUserData(data, off) mat = MaterialCommonRewardUserData(data, off)
off += mat.get_size() off += mat.get_size()

View File

@ -40,6 +40,21 @@ def decode_str(data: bytes, offset: int) -> Tuple[str, int]:
logging.getLogger('sao').error(f"Failed to parse {data[offset:]} as string!") logging.getLogger('sao').error(f"Failed to parse {data[offset:]} as string!")
return ("", 0) return ("", 0)
def encode_byte(data: int) -> bytes:
return struct.pack("!B", data)
def encode_short(data: int) -> bytes:
return struct.pack("!H", data)
def encode_int(data: int) -> bytes:
return struct.pack("!I", data)
def encode_long(data: int) -> bytes:
return struct.pack("!L", data)
def encode_bigint(data: int) -> bytes:
return struct.pack("!Q", data)
def encode_str(s: str) -> bytes: def encode_str(s: str) -> bytes:
try: try:
str_bytes = s.encode("utf-16-le", errors="replace") str_bytes = s.encode("utf-16-le", errors="replace")