Skip to content

Commit 220b0b8

Browse files
authored
Merge branch 'main' into dependabot/github_actions/actions/checkout-5
2 parents 6b241a8 + 878d2b3 commit 220b0b8

File tree

3 files changed

+82
-9
lines changed

3 files changed

+82
-9
lines changed

.github/workflows/ci-i386.yml

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
name: Tests on i386
2+
3+
on: [push, pull_request]
4+
5+
concurrency:
6+
group: ${{ github.workflow }}-${{ github.ref }}
7+
cancel-in-progress: true
8+
9+
jobs:
10+
build-i386:
11+
runs-on: ubuntu-latest
12+
13+
defaults:
14+
run:
15+
shell: bash -el {0}
16+
17+
steps:
18+
- name: Checkout source
19+
uses: actions/checkout@v4
20+
with:
21+
submodules: recursive
22+
fetch-depth: 0 # required for version resolution
23+
24+
- name: Setup Alpine Linux environment
25+
uses: jirutka/[email protected]
26+
with:
27+
arch: x86
28+
packages: >
29+
build-base
30+
python3
31+
python3-dev
32+
git
33+
py3-pip
34+
py3-pytest
35+
uv
36+
meson
37+
pkgconf
38+
py3-numpy
39+
py3-numpy-dev
40+
zstd
41+
42+
- name: Install numcodecs
43+
run: |
44+
export DISABLE_NUMCODECS_AVX2=""
45+
uv venv
46+
uv pip install -v -e .[test,test_extras,msgpack,crc32c]
47+
shell: alpine.sh {0}
48+
49+
50+
- name: Install zarr-python
51+
# Since zarr v3 requires numpy >= 1.25, on Python 3.11 leave it out
52+
# so we can have some tests of our minimum version of numpy (1.24)
53+
if: matrix.python-version != '3.11'
54+
run: uv add zarr>=3
55+
shell: alpine.sh {0}
56+
57+
58+
- name: List installed packages
59+
run: uv pip list
60+
shell: alpine.sh {0}
61+
62+
- name: Run tests
63+
run: uv run pytest -v
64+
shell: alpine.sh {0}

numcodecs/zstd.pyx

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ from .abc import Codec
1515

1616
from libc.stdlib cimport malloc, realloc, free
1717

18+
cdef extern from "stdint.h":
19+
cdef size_t SIZE_MAX
20+
1821
cdef extern from "zstd.h":
1922

2023
unsigned ZSTD_versionNumber() nogil
@@ -202,8 +205,8 @@ def decompress(source, dest=None):
202205
Py_buffer* dest_pb
203206
char* dest_ptr
204207
size_t source_size, dest_size, decompressed_size
205-
size_t nbytes, cbytes, blocksize
206208
size_t dest_nbytes
209+
unsigned long long content_size
207210

208211
# obtain source memoryview
209212
source_mv = ensure_continguous_memoryview(source)
@@ -214,14 +217,20 @@ def decompress(source, dest=None):
214217
source_size = source_pb.len
215218

216219
try:
217-
218-
# determine uncompressed size
219-
dest_size = ZSTD_getFrameContentSize(source_ptr, source_size)
220-
if dest_size == 0 or dest_size == ZSTD_CONTENTSIZE_ERROR:
220+
# determine uncompressed size using unsigned long long for full range
221+
content_size = ZSTD_getFrameContentSize(source_ptr, source_size)
222+
if content_size == ZSTD_CONTENTSIZE_UNKNOWN and dest is None:
223+
return stream_decompress(source_pb)
224+
elif content_size == ZSTD_CONTENTSIZE_UNKNOWN:
225+
# dest is not None
226+
# set dest_size based on dest
227+
pass
228+
elif content_size == ZSTD_CONTENTSIZE_ERROR or content_size == 0:
221229
raise RuntimeError('Zstd decompression error: invalid input data')
230+
elif content_size > (<unsigned long long>SIZE_MAX):
231+
raise RuntimeError('Zstd decompression error: content size too large for platform')
222232

223-
if dest_size == ZSTD_CONTENTSIZE_UNKNOWN and dest is None:
224-
return stream_decompress(source_pb)
233+
dest_size = <size_t>content_size
225234

226235
# setup destination buffer
227236
if dest is None:
@@ -236,7 +245,7 @@ def decompress(source, dest=None):
236245
dest_ptr = <char*>dest_pb.buf
237246
dest_nbytes = dest_pb.len
238247

239-
if dest_size == ZSTD_CONTENTSIZE_UNKNOWN:
248+
if content_size == ZSTD_CONTENTSIZE_UNKNOWN:
240249
dest_size = dest_nbytes
241250

242251
# validate output buffer

0 commit comments

Comments
 (0)