Skip to content

Commit 83ae64c

Browse files
Fix decode_params_tuple silently returning empty list when count > 0 but data is empty
The early return at line 102 fired unconditionally for empty data, even when a non-zero count was externally provided. This caused silent data loss instead of raising DecodeError for truncated/corrupt messages. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent a1f8412 commit 83ae64c

2 files changed

Lines changed: 23 additions & 0 deletions

File tree

src/dqlitewire/tuples.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ def decode_params_tuple(
100100
"""
101101
# Go writes nothing for empty params
102102
if len(data) == 0:
103+
if count is not None and count > 0:
104+
raise DecodeError(f"Expected data for {count} parameters, but data is empty")
103105
return [], 0
104106

105107
if len(data) < 8:

tests/test_tuples.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,27 @@ def test_decode_insufficient_data_for_header(self) -> None:
396396
with pytest.raises(DecodeError, match="Not enough data"):
397397
decode_params_tuple(b"\x01\x02\x03")
398398

399+
def test_decode_empty_data_with_nonzero_count_raises(self) -> None:
400+
"""Empty data with count > 0 should raise DecodeError, not return []."""
401+
import pytest
402+
403+
from dqlitewire.exceptions import DecodeError
404+
405+
with pytest.raises(DecodeError, match="Expected data for 5 parameters"):
406+
decode_params_tuple(b"", count=5)
407+
408+
def test_decode_empty_data_with_count_none_returns_empty(self) -> None:
409+
"""Empty data with count=None is legitimate (Go writes nothing for empty params)."""
410+
result, consumed = decode_params_tuple(b"", count=None)
411+
assert result == []
412+
assert consumed == 0
413+
414+
def test_decode_empty_data_with_count_zero_returns_empty(self) -> None:
415+
"""Empty data with count=0 is legitimate."""
416+
result, consumed = decode_params_tuple(b"", count=0)
417+
assert result == []
418+
assert consumed == 0
419+
399420
def test_decode_insufficient_data_for_types(self) -> None:
400421
"""Data too short for declared type count should raise DecodeError."""
401422
import pytest

0 commit comments

Comments
 (0)