Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-pybase64 for openSUSE:Factory
checked in at 2026-10-05 16:18:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pybase64 (Old)
and /work/SRC/openSUSE:Factory/.python-pybase64.new.3698736 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pybase64"
Mon Oct 5 16:18:29 2026 rev:3 rq:1382543 version:1.5.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pybase64/python-pybase64.changes
2026-08-09 21:46:53.005893379 +0200
+++
/work/SRC/openSUSE:Factory/.python-pybase64.new.3698736/python-pybase64.changes
2026-10-05 16:19:04.523398572 +0200
@@ -1,0 +2,10 @@
+Mon Oct 5 06:42:39 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 1.5.1:
+ * Fix a Py_buffer use-after-release in the C extension error
+ paths: the buffer was released before the error message was
+ formatted, so formatting could touch freed memory
+ * Switch to libalternatives where available, keeping
+ update-alternatives on Leap 15
+
+-------------------------------------------------------------------
Old:
----
pybase64-1.5.0.tar.gz
New:
----
pybase64-1.5.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pybase64.spec ++++++
--- /var/tmp/diff_new_pack.y37YG5/_old 2026-10-05 16:19:05.573442416 +0200
+++ /var/tmp/diff_new_pack.y37YG5/_new 2026-10-05 16:19:05.576442541 +0200
@@ -16,9 +16,14 @@
#
+%if 0%{?suse_version} > 1500
+%bcond_without libalternatives
+%else
+%bcond_with libalternatives
+%endif
%{?sle15_python_module_pythons}
Name: python-pybase64
-Version: 1.5.0
+Version: 1.5.1
Release: 0
Summary: Fast Base64 encoding/decoding
License: BSD-2-Clause
@@ -36,8 +41,13 @@
BuildRequires: fdupes
BuildRequires: gcc
BuildRequires: python-rpm-macros
+%if %{with libalternatives}
+BuildRequires: alts
+Requires: alts
+%else
Requires(post): update-alternatives
Requires(postun): update-alternatives
+%endif
%python_subpackages
%description
@@ -61,9 +71,9 @@
# The PyPI sdist ships tests/ but omits the tests/utils.py helper, which lives
# only in the git tree, so tests/test_pybase64.py and tests/test_benchmark.py
# cannot even be imported - both start with "from . import utils".
-# test_main.py and test_packaging.py are self-contained and do run; test_sbom
-# is deselected because it asserts a CycloneDX SBOM that only the official
-# PyPI wheels carry.
+# test_main.py and test_packaging.py are self-contained and do run;
+# tests/test_packaging.py::test_sbom is deselected because it asserts a
+# CycloneDX SBOM that only the official PyPI wheels carry.
%pytest_arch tests/test_main.py tests/test_packaging.py -m "not
pypi_distribution"
# The functional test module is the one that cannot run, so also exercise the
# built C extension with a round trip.
@@ -75,6 +85,9 @@
%postun
%python_uninstall_alternative pybase64
+%pre
+%python_libalternatives_reset_alternative pybase64
+
%files %{python_files}
%license LICENSE
%doc README.rst
++++++ pybase64-1.5.0.tar.gz -> pybase64-1.5.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pybase64-1.5.0/PKG-INFO new/pybase64-1.5.1/PKG-INFO
--- old/pybase64-1.5.0/PKG-INFO 2026-08-08 12:51:25.816278700 +0200
+++ new/pybase64-1.5.1/PKG-INFO 2026-10-04 14:21:39.935015000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: pybase64
-Version: 1.5.0
+Version: 1.5.1
Summary: Fast Base64 encoding/decoding
Author: Matthieu Darbois
License-Expression: BSD-2-Clause
@@ -117,66 +117,66 @@
.. begin benchmark
-Running Python 3.15.0rc1, Apple clang version 21.0.0 (clang-2100.1.1.101),
macOS 26.5.2, Apple M1 Max
+Running Python 3.15.0rc3, Apple clang version 21.0.0 (clang-2100.3.34.2),
macOS 26.6.2, Apple M1 Max
.. code::
- pybase64 1.5.0 (C extension active - NEON)
+ pybase64 1.5.1 (C extension active - NEON)
bench: altchars=None, validate=True, padded=True
- pybase64.encodebytes: 6595 MB/s (135,696 bytes -> 183,309 bytes)
- pybase64.b64encode: 17492 MB/s (135,696 bytes -> 180,928 bytes)
- pybase64.b64decode: 9037 MB/s (180,928 bytes -> 135,696 bytes)
- base64.encodebytes: 2386 MB/s (135,696 bytes -> 183,309 bytes)
- base64.b64encode: 2653 MB/s (135,696 bytes -> 180,928 bytes)
- base64.b64decode: 2656 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.encodebytes: 6577 MB/s (135,696 bytes -> 183,309 bytes)
+ pybase64.b64encode: 17614 MB/s (135,696 bytes -> 180,928 bytes)
+ pybase64.b64decode: 8975 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.encodebytes: 2342 MB/s (135,696 bytes -> 183,309 bytes)
+ base64.b64encode: 2640 MB/s (135,696 bytes -> 180,928 bytes)
+ base64.b64decode: 2594 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=None, validate=True, padded=False
- pybase64.b64encode: 17547 MB/s (135,696 bytes -> 180,928 bytes)
- pybase64.b64decode: 2521 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64encode: 2656 MB/s (135,696 bytes -> 180,928 bytes)
- base64.b64decode: 2655 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64encode: 17525 MB/s (135,696 bytes -> 180,928 bytes)
+ pybase64.b64decode: 2475 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64encode: 2665 MB/s (135,696 bytes -> 180,928 bytes)
+ base64.b64decode: 2604 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=None, ignorechars=b'', padded=False
- pybase64.b64decode: 2510 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64decode: 2655 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2491 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64decode: 2642 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=None, ignorechars=b'\n', padded=True
- pybase64.b64decode: 2370 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 2087 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2364 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 2083 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=None, ignorechars=b'\n', padded=False
- pybase64.b64decode: 2365 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1964 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2358 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1945 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=None, validate=False, padded=True
- pybase64.b64decode: 2369 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 2030 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2365 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 2033 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=None, validate=False, padded=False
- pybase64.b64decode: 2361 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1982 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2362 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1965 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=True, padded=True
- pybase64.b64encode: 10900 MB/s (135,696 bytes -> 180,928 bytes)
- pybase64.b64decode: 5974 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64encode: 2675 MB/s (135,696 bytes -> 180,928 bytes)
- base64.b64decode: 1186 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64encode: 10779 MB/s (135,696 bytes -> 180,928 bytes)
+ pybase64.b64decode: 6007 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64encode: 2659 MB/s (135,696 bytes -> 180,928 bytes)
+ base64.b64decode: 1195 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=True, padded=False
- pybase64.b64encode: 10798 MB/s (135,696 bytes -> 180,928 bytes)
- pybase64.b64decode: 2135 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64encode: 2571 MB/s (135,696 bytes -> 180,928 bytes)
- base64.b64decode: 1154 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64encode: 10692 MB/s (135,696 bytes -> 180,928 bytes)
+ pybase64.b64decode: 2194 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64encode: 2658 MB/s (135,696 bytes -> 180,928 bytes)
+ base64.b64decode: 1196 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'', padded=True
- pybase64.b64decode: 5770 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64decode: 2629 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64decode: 5952 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64decode: 2631 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'', padded=False
- pybase64.b64decode: 2201 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64decode: 2606 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2183 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64decode: 2595 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'\n', padded=True
- pybase64.b64decode: 2058 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 2069 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2054 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 2060 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'\n', padded=False
- pybase64.b64decode: 2058 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1882 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2069 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1937 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=False, padded=True
- pybase64.b64decode: 2030 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1005 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2073 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1055 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=False, padded=False
- pybase64.b64decode: 2081 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1031 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2084 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1038 MB/s (183,308 bytes -> 135,696 bytes)
.. end benchmark
@@ -184,8 +184,12 @@
Changelog
=========
+1.5.1
+-----
+- Fix a Py_buffer Use-After-Release in error paths
+
1.5.0
-------
+-----
- Speed-up translation on aarch64
- Fix invalid data successfully decoded when using altchars (slice ends with
padding)
- Fix thread safety selecting codec
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pybase64-1.5.0/README.rst
new/pybase64-1.5.1/README.rst
--- old/pybase64-1.5.0/README.rst 2026-08-08 12:51:23.000000000 +0200
+++ new/pybase64-1.5.1/README.rst 2026-10-04 14:21:37.055001300 +0200
@@ -87,66 +87,66 @@
.. begin benchmark
-Running Python 3.15.0rc1, Apple clang version 21.0.0 (clang-2100.1.1.101),
macOS 26.5.2, Apple M1 Max
+Running Python 3.15.0rc3, Apple clang version 21.0.0 (clang-2100.3.34.2),
macOS 26.6.2, Apple M1 Max
.. code::
- pybase64 1.5.0 (C extension active - NEON)
+ pybase64 1.5.1 (C extension active - NEON)
bench: altchars=None, validate=True, padded=True
- pybase64.encodebytes: 6595 MB/s (135,696 bytes -> 183,309 bytes)
- pybase64.b64encode: 17492 MB/s (135,696 bytes -> 180,928 bytes)
- pybase64.b64decode: 9037 MB/s (180,928 bytes -> 135,696 bytes)
- base64.encodebytes: 2386 MB/s (135,696 bytes -> 183,309 bytes)
- base64.b64encode: 2653 MB/s (135,696 bytes -> 180,928 bytes)
- base64.b64decode: 2656 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.encodebytes: 6577 MB/s (135,696 bytes -> 183,309 bytes)
+ pybase64.b64encode: 17614 MB/s (135,696 bytes -> 180,928 bytes)
+ pybase64.b64decode: 8975 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.encodebytes: 2342 MB/s (135,696 bytes -> 183,309 bytes)
+ base64.b64encode: 2640 MB/s (135,696 bytes -> 180,928 bytes)
+ base64.b64decode: 2594 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=None, validate=True, padded=False
- pybase64.b64encode: 17547 MB/s (135,696 bytes -> 180,928 bytes)
- pybase64.b64decode: 2521 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64encode: 2656 MB/s (135,696 bytes -> 180,928 bytes)
- base64.b64decode: 2655 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64encode: 17525 MB/s (135,696 bytes -> 180,928 bytes)
+ pybase64.b64decode: 2475 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64encode: 2665 MB/s (135,696 bytes -> 180,928 bytes)
+ base64.b64decode: 2604 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=None, ignorechars=b'', padded=False
- pybase64.b64decode: 2510 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64decode: 2655 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2491 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64decode: 2642 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=None, ignorechars=b'\n', padded=True
- pybase64.b64decode: 2370 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 2087 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2364 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 2083 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=None, ignorechars=b'\n', padded=False
- pybase64.b64decode: 2365 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1964 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2358 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1945 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=None, validate=False, padded=True
- pybase64.b64decode: 2369 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 2030 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2365 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 2033 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=None, validate=False, padded=False
- pybase64.b64decode: 2361 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1982 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2362 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1965 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=True, padded=True
- pybase64.b64encode: 10900 MB/s (135,696 bytes -> 180,928 bytes)
- pybase64.b64decode: 5974 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64encode: 2675 MB/s (135,696 bytes -> 180,928 bytes)
- base64.b64decode: 1186 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64encode: 10779 MB/s (135,696 bytes -> 180,928 bytes)
+ pybase64.b64decode: 6007 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64encode: 2659 MB/s (135,696 bytes -> 180,928 bytes)
+ base64.b64decode: 1195 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=True, padded=False
- pybase64.b64encode: 10798 MB/s (135,696 bytes -> 180,928 bytes)
- pybase64.b64decode: 2135 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64encode: 2571 MB/s (135,696 bytes -> 180,928 bytes)
- base64.b64decode: 1154 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64encode: 10692 MB/s (135,696 bytes -> 180,928 bytes)
+ pybase64.b64decode: 2194 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64encode: 2658 MB/s (135,696 bytes -> 180,928 bytes)
+ base64.b64decode: 1196 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'', padded=True
- pybase64.b64decode: 5770 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64decode: 2629 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64decode: 5952 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64decode: 2631 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'', padded=False
- pybase64.b64decode: 2201 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64decode: 2606 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2183 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64decode: 2595 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'\n', padded=True
- pybase64.b64decode: 2058 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 2069 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2054 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 2060 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'\n', padded=False
- pybase64.b64decode: 2058 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1882 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2069 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1937 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=False, padded=True
- pybase64.b64decode: 2030 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1005 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2073 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1055 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=False, padded=False
- pybase64.b64decode: 2081 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1031 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2084 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1038 MB/s (183,308 bytes -> 135,696 bytes)
.. end benchmark
@@ -154,8 +154,12 @@
Changelog
=========
+1.5.1
+-----
+- Fix a Py_buffer Use-After-Release in error paths
+
1.5.0
-------
+-----
- Speed-up translation on aarch64
- Fix invalid data successfully decoded when using altchars (slice ends with
padding)
- Fix thread safety selecting codec
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pybase64-1.5.0/pyproject.toml
new/pybase64-1.5.1/pyproject.toml
--- old/pybase64-1.5.0/pyproject.toml 2026-08-08 12:51:23.000000000 +0200
+++ new/pybase64-1.5.1/pyproject.toml 2026-10-04 14:21:37.055513400 +0200
@@ -70,7 +70,6 @@
{include-group = "test"},
"coverage[toml]>=7.10", # >= 7.10, we use tool.coverage.run.patch config
"gcovr>=8",
- "lxml>=7.0.0a3 ; python_version >= '3.15'",
"pytest-cov>=7", # needed for coverage>=7.10
]
# we don't support docs for python<3.12
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pybase64-1.5.0/src/pybase64/_pybase64.c
new/pybase64-1.5.1/src/pybase64/_pybase64.c
--- old/pybase64-1.5.0/src/pybase64/_pybase64.c 2026-08-08 12:51:23.000000000
+0200
+++ new/pybase64-1.5.1/src/pybase64/_pybase64.c 2026-10-04 14:21:37.056132800
+0200
@@ -59,20 +59,20 @@
#if defined(PYPY_VERSION)
/* PyPy does not respect PyBUF_C_CONTIGUOUS */
if (!PyBuffer_IsContiguous(buffer, 'C')) {
- PyBuffer_Release(buffer);
PyErr_Format(PyExc_BufferError, "%R: underlying buffer is not
C-contiguous", Py_TYPE(object));
+ PyBuffer_Release(buffer);
return -1;
}
#endif
if (bytes_like) {
if (((buffer->format[0] != 'c') && (buffer->format[0] != 'b') &&
(buffer->format[0] != 'B')) || buffer->format[1] != '\0' ) {
- PyBuffer_Release(buffer);
PyErr_Format(PyExc_TypeError, "expected single byte elements, not
'%s' from %R", buffer->format, Py_TYPE(object));
+ PyBuffer_Release(buffer);
return -1;
}
if (buffer->ndim != 1) {
- PyBuffer_Release(buffer);
PyErr_Format(PyExc_TypeError, "expected 1-D data, not %d-D data
from %R", buffer->ndim, Py_TYPE(object));
+ PyBuffer_Release(buffer);
return -1;
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pybase64-1.5.0/src/pybase64/_version.py
new/pybase64-1.5.1/src/pybase64/_version.py
--- old/pybase64-1.5.0/src/pybase64/_version.py 2026-08-08 12:51:23.000000000
+0200
+++ new/pybase64-1.5.1/src/pybase64/_version.py 2026-10-04 14:21:37.056132800
+0200
@@ -1,3 +1,3 @@
from __future__ import annotations
-_version = "1.5.0"
+_version = "1.5.1"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pybase64-1.5.0/src/pybase64.egg-info/PKG-INFO
new/pybase64-1.5.1/src/pybase64.egg-info/PKG-INFO
--- old/pybase64-1.5.0/src/pybase64.egg-info/PKG-INFO 2026-08-08
12:51:25.000000000 +0200
+++ new/pybase64-1.5.1/src/pybase64.egg-info/PKG-INFO 2026-10-04
14:21:39.916967600 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: pybase64
-Version: 1.5.0
+Version: 1.5.1
Summary: Fast Base64 encoding/decoding
Author: Matthieu Darbois
License-Expression: BSD-2-Clause
@@ -117,66 +117,66 @@
.. begin benchmark
-Running Python 3.15.0rc1, Apple clang version 21.0.0 (clang-2100.1.1.101),
macOS 26.5.2, Apple M1 Max
+Running Python 3.15.0rc3, Apple clang version 21.0.0 (clang-2100.3.34.2),
macOS 26.6.2, Apple M1 Max
.. code::
- pybase64 1.5.0 (C extension active - NEON)
+ pybase64 1.5.1 (C extension active - NEON)
bench: altchars=None, validate=True, padded=True
- pybase64.encodebytes: 6595 MB/s (135,696 bytes -> 183,309 bytes)
- pybase64.b64encode: 17492 MB/s (135,696 bytes -> 180,928 bytes)
- pybase64.b64decode: 9037 MB/s (180,928 bytes -> 135,696 bytes)
- base64.encodebytes: 2386 MB/s (135,696 bytes -> 183,309 bytes)
- base64.b64encode: 2653 MB/s (135,696 bytes -> 180,928 bytes)
- base64.b64decode: 2656 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.encodebytes: 6577 MB/s (135,696 bytes -> 183,309 bytes)
+ pybase64.b64encode: 17614 MB/s (135,696 bytes -> 180,928 bytes)
+ pybase64.b64decode: 8975 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.encodebytes: 2342 MB/s (135,696 bytes -> 183,309 bytes)
+ base64.b64encode: 2640 MB/s (135,696 bytes -> 180,928 bytes)
+ base64.b64decode: 2594 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=None, validate=True, padded=False
- pybase64.b64encode: 17547 MB/s (135,696 bytes -> 180,928 bytes)
- pybase64.b64decode: 2521 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64encode: 2656 MB/s (135,696 bytes -> 180,928 bytes)
- base64.b64decode: 2655 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64encode: 17525 MB/s (135,696 bytes -> 180,928 bytes)
+ pybase64.b64decode: 2475 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64encode: 2665 MB/s (135,696 bytes -> 180,928 bytes)
+ base64.b64decode: 2604 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=None, ignorechars=b'', padded=False
- pybase64.b64decode: 2510 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64decode: 2655 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2491 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64decode: 2642 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=None, ignorechars=b'\n', padded=True
- pybase64.b64decode: 2370 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 2087 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2364 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 2083 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=None, ignorechars=b'\n', padded=False
- pybase64.b64decode: 2365 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1964 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2358 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1945 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=None, validate=False, padded=True
- pybase64.b64decode: 2369 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 2030 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2365 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 2033 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=None, validate=False, padded=False
- pybase64.b64decode: 2361 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1982 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2362 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1965 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=True, padded=True
- pybase64.b64encode: 10900 MB/s (135,696 bytes -> 180,928 bytes)
- pybase64.b64decode: 5974 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64encode: 2675 MB/s (135,696 bytes -> 180,928 bytes)
- base64.b64decode: 1186 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64encode: 10779 MB/s (135,696 bytes -> 180,928 bytes)
+ pybase64.b64decode: 6007 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64encode: 2659 MB/s (135,696 bytes -> 180,928 bytes)
+ base64.b64decode: 1195 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=True, padded=False
- pybase64.b64encode: 10798 MB/s (135,696 bytes -> 180,928 bytes)
- pybase64.b64decode: 2135 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64encode: 2571 MB/s (135,696 bytes -> 180,928 bytes)
- base64.b64decode: 1154 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64encode: 10692 MB/s (135,696 bytes -> 180,928 bytes)
+ pybase64.b64decode: 2194 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64encode: 2658 MB/s (135,696 bytes -> 180,928 bytes)
+ base64.b64decode: 1196 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'', padded=True
- pybase64.b64decode: 5770 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64decode: 2629 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64decode: 5952 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64decode: 2631 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'', padded=False
- pybase64.b64decode: 2201 MB/s (180,928 bytes -> 135,696 bytes)
- base64.b64decode: 2606 MB/s (180,928 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2183 MB/s (180,928 bytes -> 135,696 bytes)
+ base64.b64decode: 2595 MB/s (180,928 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'\n', padded=True
- pybase64.b64decode: 2058 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 2069 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2054 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 2060 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', ignorechars=b'\n', padded=False
- pybase64.b64decode: 2058 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1882 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2069 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1937 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=False, padded=True
- pybase64.b64decode: 2030 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1005 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2073 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1055 MB/s (183,308 bytes -> 135,696 bytes)
bench: altchars=b'-_', validate=False, padded=False
- pybase64.b64decode: 2081 MB/s (183,308 bytes -> 135,696 bytes)
- base64.b64decode: 1031 MB/s (183,308 bytes -> 135,696 bytes)
+ pybase64.b64decode: 2084 MB/s (183,308 bytes -> 135,696 bytes)
+ base64.b64decode: 1038 MB/s (183,308 bytes -> 135,696 bytes)
.. end benchmark
@@ -184,8 +184,12 @@
Changelog
=========
+1.5.1
+-----
+- Fix a Py_buffer Use-After-Release in error paths
+
1.5.0
-------
+-----
- Speed-up translation on aarch64
- Fix invalid data successfully decoded when using altchars (slice ends with
padding)
- Fix thread safety selecting codec