Skip to content

fix(util): guard _datetime_from_weaviate_str against empty string#2053

Open
devteamaegis wants to merge 1 commit into
weaviate:mainfrom
devteamaegis:fix/indexerror-empty-datetime-str
Open

fix(util): guard _datetime_from_weaviate_str against empty string#2053
devteamaegis wants to merge 1 commit into
weaviate:mainfrom
devteamaegis:fix/indexerror-empty-datetime-str

Conversation

@devteamaegis
Copy link
Copy Markdown

What's broken

_datetime_from_weaviate_str in weaviate/util.py evaluates string[-1] on line 754 without checking whether string is empty. Python's negative indexing on an empty string raises IndexError. The protobuf wire-format default for a string field is "", so any gRPC query response containing an object with an unset date property crashes the client during deserialization in base_executor.py.

Traceback: IndexError: string index out of range at weaviate/util.py line 754.

Why it happens

The function assumes the input is a non-empty datetime string and immediately indexes from the end, which is invalid for the empty-string protobuf default.

Fix

Added a two-line guard at the top of _datetime_from_weaviate_str: if string is empty, return datetime.min. This matches the existing behaviour for year-zero dates and avoids any semantic change for valid inputs.

Test

Added ("", datetime.min) as a parametrized case in the existing test_datetime_from_weaviate_str test in test/test_util.py. All 40 tests pass.

Fixes #2052

Empty string is the protobuf wire-format default for an unset string
field. Calling string[-1] on "" raises IndexError, crashing gRPC
deserialization for any object with an unset date property. Return
datetime.min for empty input, matching the existing behaviour for
year-zero dates.

Fixes weaviate#2052
Copy link
Copy Markdown

@orca-security-eu orca-security-eu Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Orca Security Scan Summary

Status Check Issues by priority
Passed Passed Infrastructure as Code high 0   medium 0   low 0   info 0 View in Orca
Passed Passed SAST high 0   medium 0   low 0   info 0 View in Orca
Passed Passed Secrets high 0   medium 0   low 0   info 0 View in Orca
Passed Passed Vulnerabilities high 0   medium 0   low 0   info 0 View in Orca

@weaviate-git-bot
Copy link
Copy Markdown

To avoid any confusion in the future about your contribution to Weaviate, we work with a Contributor License Agreement. If you agree, you can simply add a comment to this PR that you agree with the CLA so that we can merge.

beep boop - the Weaviate bot 👋🤖

PS:
Are you already a member of the Weaviate Forum?

Comment thread weaviate/util.py

def _datetime_from_weaviate_str(string: str) -> datetime.datetime:
if not string:
return datetime.datetime.min
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wouldn't "None" be a better return here?

If we have properties I would expect None if it is unset in Weaviate

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

BUG: IndexError in _datetime_from_weaviate_str when date property is unset (empty string)

3 participants