Skip to content

Commit 69c219a

Browse files
authored
DOP-1079: Fix crashes caused by incorrect split() usage (#159)
1 parent 12829be commit 69c219a

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

snooty/intersphinx.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def parse(cls, base_url: str, text: bytes) -> "Inventory":
124124
logger.debug(f"Invalid priority in intersphinx inventory: {line}")
125125
continue
126126

127-
domain, role = domain_and_role.split(":", 2)
127+
domain, role = domain_and_role.split(":", 1)
128128

129129
# "If {dispname} is identical to {name}, it is stored as -"
130130
if dispname == "-":

snooty/test_intersphinx.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from pytest import raises
44
from .intersphinx import fetch_inventory, Inventory
55
from .parser import Project
6+
from .types import TargetDatabase, FileId
67
from .test_project import Backend
78

89
TESTING_CACHE_DIR = Path(".intersphinx_cache")
@@ -89,3 +90,21 @@ def test_dump_target_database() -> None:
8990
continue
9091

9192
assert reference_definition == generated_definition
93+
94+
95+
def test_target_strange_fields() -> None:
96+
db = TargetDatabase()
97+
98+
# Ensure that a weird target with a colon does not crash inventory generation
99+
db.define_local_target("std", "label", ["foo:bar"], FileId("foo"), [])
100+
inventory = db.generate_inventory("")
101+
102+
# Now corrupt the domain:role name pair to ensure we don't crash
103+
good_role_name = "std:label:foo:bar"
104+
weird_role_name = "std:lab:el:foo:bar"
105+
inventory.targets[weird_role_name] = inventory.targets[good_role_name]._replace(
106+
role=("std", "lab:el")
107+
)
108+
del inventory.targets[good_role_name]
109+
inventory_bytes = inventory.dumps("", "")
110+
Inventory.parse("", inventory_bytes)

snooty/types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ def generate_inventory(self, base_url: str) -> intersphinx.Inventory:
221221
definition = definitions[0]
222222
uri = definition.fileid.without_known_suffix + "/"
223223
dispname = "".join(node.get_text() for node in definition.title)
224-
domain, role_name, name = key.split(":", 3)
224+
domain, role_name, name = key.split(":", 2)
225225

226226
if not dispname:
227227
dispname = name

0 commit comments

Comments
 (0)