Skip to content

Commit eb61851

Browse files
committed
handle bad paths in sys.path
fixes pythonnet#2376
1 parent 32051cb commit eb61851

File tree

4 files changed

+24
-2
lines changed

4 files changed

+24
-2
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].
2222
### Fixed
2323

2424
- Fixed RecursionError for reverse operators on C# operable types from python. See #2240
25+
- Fixed probing for assemblies in `sys.path` failing when a path in `sys.path` has invalid characters. See #2376
2526

2627
## [3.0.3](https://github.com/pythonnet/pythonnet/releases/tag/v3.0.3) - 2023-10-11
2728

src/runtime/AssemblyManager.cs

+7
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,13 @@ static IEnumerable<string> FindAssemblyCandidates(string name)
200200
}
201201
else
202202
{
203+
int invalidCharIndex = head.IndexOfAny(Path.GetInvalidPathChars());
204+
if (invalidCharIndex >= 0)
205+
{
206+
using var importWarning = Runtime.PyObject_GetAttrString(Exceptions.exceptions_module, "ImportWarning");
207+
Exceptions.warn($"Path entry '{head}' has invalid char at position {invalidCharIndex}", importWarning.BorrowOrThrow());
208+
continue;
209+
}
203210
path = Path.Combine(head, name);
204211
}
205212

src/runtime/Exceptions.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ public static void warn(string message, BorrowedReference exception, int stackle
270270
}
271271

272272
using var warn = Runtime.PyObject_GetAttrString(warnings_module.obj, "warn");
273-
Exceptions.ErrorCheck(warn.Borrow());
273+
warn.BorrowOrThrow();
274274

275275
using var argsTemp = Runtime.PyTuple_New(3);
276276
BorrowedReference args = argsTemp.BorrowOrThrow();
@@ -283,7 +283,7 @@ public static void warn(string message, BorrowedReference exception, int stackle
283283
Runtime.PyTuple_SetItem(args, 2, level.StealOrThrow());
284284

285285
using var result = Runtime.PyObject_CallObject(warn.Borrow(), args);
286-
Exceptions.ErrorCheck(result.Borrow());
286+
result.BorrowOrThrow();
287287
}
288288

289289
public static void warn(string message, BorrowedReference exception)

tests/test_module.py

+14
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,20 @@ def test_clr_add_reference():
344344
with pytest.raises(FileNotFoundException):
345345
AddReference("somethingtotallysilly")
346346

347+
348+
def test_clr_add_reference_bad_path():
349+
import sys
350+
from clr import AddReference
351+
from System.IO import FileNotFoundException
352+
bad_path = "hello\0world"
353+
sys.path.append(bad_path)
354+
try:
355+
with pytest.raises(FileNotFoundException):
356+
AddReference("test_clr_add_reference_bad_path")
357+
finally:
358+
sys.path.remove(bad_path)
359+
360+
347361
def test_clr_get_clr_type():
348362
"""Test clr.GetClrType()."""
349363
from clr import GetClrType

0 commit comments

Comments
 (0)