Skip to content

Commit 2f03898

Browse files
authored
FIX: Audio files content check bug (#1579)
1 parent 800bc4e commit 2f03898

2 files changed

Lines changed: 37 additions & 5 deletions

File tree

pyrit/backend/services/attack_service.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -870,11 +870,14 @@ async def _persist_base64_pieces_async(request: AddMessageRequest) -> None:
870870
piece.converted_value = file_path
871871
continue
872872

873-
# Already an existing file on disk — keep as-is
874-
if Path(piece.original_value).is_file():
875-
if piece.converted_value is None:
876-
piece.converted_value = piece.original_value
877-
continue
873+
# Already an existing file on disk — keep as-is.
874+
try:
875+
if Path(piece.original_value).is_file():
876+
if piece.converted_value is None:
877+
piece.converted_value = piece.original_value
878+
continue
879+
except (OSError, ValueError):
880+
pass
878881

879882
# Derive file extension from the MIME type sent by the frontend
880883
ext = None

tests/unit/backend/test_attack_service.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1596,6 +1596,35 @@ async def test_non_path_data_types_are_skipped(self, attack_service) -> None:
15961596

15971597
assert request.pieces[0].original_value == "thinking step"
15981598

1599+
@pytest.mark.asyncio
1600+
async def test_long_base64_audio_does_not_crash(self, attack_service) -> None:
1601+
"""Base64 audio data longer than OS path limits should be saved, not crash with OSError."""
1602+
# Simulate a base64-encoded WAV file (>4096 chars, exceeds Linux filename limit of 255)
1603+
long_b64 = "UklGRiQ" + "A" * 5000 # fake WAV header + padding
1604+
request = AddMessageRequest(
1605+
role="user",
1606+
pieces=[
1607+
MessagePieceRequest(
1608+
data_type="audio_path",
1609+
original_value=long_b64,
1610+
mime_type="audio/wav",
1611+
)
1612+
],
1613+
send=False,
1614+
target_conversation_id="test-id",
1615+
)
1616+
1617+
with patch("pyrit.backend.services.attack_service.data_serializer_factory") as mock_factory:
1618+
mock_serializer = AsyncMock()
1619+
mock_serializer.value = "/tmp/saved_audio.wav"
1620+
mock_factory.return_value = mock_serializer
1621+
1622+
await AttackService._persist_base64_pieces_async(request)
1623+
1624+
mock_factory.assert_called_once()
1625+
mock_serializer.save_b64_image.assert_called_once_with(data=long_b64)
1626+
assert request.pieces[0].original_value == "/tmp/saved_audio.wav"
1627+
15991628

16001629
# ============================================================================
16011630
# Related Conversations Tests

0 commit comments

Comments
 (0)