Skip to content

Commit

Permalink
handle bad paths in sys.path (#2383)
Browse files Browse the repository at this point in the history
fixes #2376
  • Loading branch information
lostmsu committed May 11, 2024
1 parent 32051cb commit b112885
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].
### Fixed

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

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

Expand Down
7 changes: 7 additions & 0 deletions src/runtime/AssemblyManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,13 @@ static IEnumerable<string> FindAssemblyCandidates(string name)
}
else
{
int invalidCharIndex = head.IndexOfAny(Path.GetInvalidPathChars());
if (invalidCharIndex >= 0)
{
using var importWarning = Runtime.PyObject_GetAttrString(Exceptions.exceptions_module, "ImportWarning");
Exceptions.warn($"Path entry '{head}' has invalid char at position {invalidCharIndex}", importWarning.BorrowOrThrow());
continue;
}
path = Path.Combine(head, name);
}

Expand Down
4 changes: 2 additions & 2 deletions src/runtime/Exceptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ public static void warn(string message, BorrowedReference exception, int stackle
}

using var warn = Runtime.PyObject_GetAttrString(warnings_module.obj, "warn");
Exceptions.ErrorCheck(warn.Borrow());
warn.BorrowOrThrow();

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

using var result = Runtime.PyObject_CallObject(warn.Borrow(), args);
Exceptions.ErrorCheck(result.Borrow());
result.BorrowOrThrow();
}

public static void warn(string message, BorrowedReference exception)
Expand Down
14 changes: 14 additions & 0 deletions tests/test_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,20 @@ def test_clr_add_reference():
with pytest.raises(FileNotFoundException):
AddReference("somethingtotallysilly")


def test_clr_add_reference_bad_path():
import sys
from clr import AddReference
from System.IO import FileNotFoundException
bad_path = "hello\0world"
sys.path.append(bad_path)
try:
with pytest.raises(FileNotFoundException):
AddReference("test_clr_add_reference_bad_path")
finally:
sys.path.remove(bad_path)


def test_clr_get_clr_type():
"""Test clr.GetClrType()."""
from clr import GetClrType
Expand Down

0 comments on commit b112885

Please sign in to comment.