Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python310 for openSUSE:Factory 
checked in at 2026-04-19 14:20:56
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python310 (Old)
 and      /work/SRC/openSUSE:Factory/.python310.new.11940 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python310"

Sun Apr 19 14:20:56 2026 rev:76 rq:1347983 version:3.10.20

Changes:
--------
--- /work/SRC/openSUSE:Factory/python310/python310.changes      2026-04-09 
16:21:57.935658061 +0200
+++ /work/SRC/openSUSE:Factory/.python310.new.11940/python310.changes   
2026-04-19 14:21:22.186108232 +0200
@@ -1,0 +2,15 @@
+Wed Apr 15 18:00:50 UTC 2026 - Matej Cepl <[email protected]>
+
+- Add CVE-2026-3446-base64-padding.patch preventing ignoring
+  excess Base64 data after the first padded quad (bsc#1261970,
+  CVE-2026-3446, gh#python/cpython#145264).
+
+-------------------------------------------------------------------
+Wed Apr  8 16:12:36 CEST 2026 - Matej Cepl <[email protected]>
+
+- Rewrite structure of Python interpreter packages.
+  `python3*` symbols should be now provided by real python3
+  packages and its subpackages instead of the virtual provides
+  (bsc#1258364).
+
+-------------------------------------------------------------------

New:
----
  CVE-2026-3446-base64-padding.patch

----------(New B)----------
  New:
- Add CVE-2026-3446-base64-padding.patch preventing ignoring
  excess Base64 data after the first padded quad (bsc#1261970,
----------(New E)----------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python310.spec ++++++
--- /var/tmp/diff_new_pack.hpiQZJ/_old  2026-04-19 14:21:23.446159469 +0200
+++ /var/tmp/diff_new_pack.hpiQZJ/_new  2026-04-19 14:21:23.450159631 +0200
@@ -230,6 +230,9 @@
 # PATCH-FIX-UPSTREAM CVE-2026-3479-pkgutil_get_data.patch bsc#1259989 
[email protected]
 # pkgutil.get_data() reject invalid resource arguments
 Patch46:        CVE-2026-3479-pkgutil_get_data.patch
+# PATCH-FIX-UPSTREAM CVE-2026-3446-base64-padding.patch bsc#1261970 
[email protected]
+# Do not ignore excess Base64 data after the first padded quad
+Patch47:        CVE-2026-3446-base64-padding.patch
 ### END OF PATCHES                                                             
 
 BuildRequires:  autoconf-archive
 BuildRequires:  automake
@@ -246,8 +249,10 @@
 BuildRequires:  pkgconfig(uuid)
 BuildRequires:  pkgconfig(zlib)
 #!BuildIgnore:  gdk-pixbuf-loader-rsvg
-%if 0%{?suse_version} >= 1550
+%if 0%{?suse_version} >= 1550 && %{without base}
 # The provider for python(abi) is in rpm-build-python
+# Skip for the base flavor: rpm-build-python requires python3-base, which
+# creates an unresolvable dependency loop when building python3xx-base itself.
 BuildRequires:  rpm-build-python
 %endif
 %if 0%{?suse_version} >= 1500 && 0%{?suse_version} < 1599
@@ -286,11 +291,6 @@
 Recommends:     %{python_pkg_name}-dbm
 Recommends:     %{python_pkg_name}-pip
 %obsolete_python_versioned
-%if %{primary_interpreter}
-Provides:       python3 = %{python_version}
-Provides:       python3-readline
-Provides:       python3-sqlite3
-%endif
 %endif
 
 %description
@@ -311,9 +311,6 @@
 Summary:        TkInter, a Python Tk Interface
 Requires:       %{python_pkg_name} = %{version}
 %obsolete_python_versioned tk
-%if %{primary_interpreter}
-Provides:       python3-tk = %{version}
-%endif
 
 %description -n %{python_pkg_name}-tk
 Python interface to Tk. Tk is the GUI toolkit that comes with Tcl.
@@ -322,9 +319,6 @@
 Summary:        Python Interface to the (N)Curses Library
 Requires:       %{python_pkg_name} = %{version}
 %obsolete_python_versioned curses
-%if %{primary_interpreter}
-Provides:       python3-curses
-%endif
 
 %description -n %{python_pkg_name}-curses
 An easy to use interface to the (n)curses CUI library. CUI stands for
@@ -334,9 +328,6 @@
 Summary:        Python Interface to the GDBM Library
 Requires:       %{python_pkg_name} = %{version}
 %obsolete_python_versioned dbm
-%if %{primary_interpreter}
-Provides:       python3-dbm
-%endif
 
 %description -n %{python_pkg_name}-dbm
 An easy to use interface for Unix DBM databases, and more specifically,
@@ -347,9 +338,6 @@
 Requires:       %{python_pkg_name} = %{version}
 Requires:       %{python_pkg_name}-tk
 %obsolete_python_versioned idle
-%if %{primary_interpreter}
-Provides:       python3-idle = %{version}
-%endif
 
 %description -n %{python_pkg_name}-idle
 IDLE is a Tkinter based integrated development environment for Python.
@@ -361,9 +349,6 @@
 Summary:        Package Documentation for Python 3
 Enhances:       %{python_pkg_name} = %{python_version}
 %obsolete_python_versioned doc
-%if %{primary_interpreter}
-Provides:       python3-doc = %{version}
-%endif
 
 %description -n %{python_pkg_name}-doc
 Tutorial, Global Module Index, Language Reference, Library Reference,
@@ -373,9 +358,6 @@
 %package -n %{python_pkg_name}-doc-devhelp
 Summary:        Additional Package Documentation for Python 3 in devhelp format
 %obsolete_python_versioned doc-devhelp
-%if %{primary_interpreter}
-Provides:       python3-doc-devhelp = %{version}
-%endif
 
 %description -n %{python_pkg_name}-doc-devhelp
 Tutorial, Global Module Index, Language Reference, Library Reference,
@@ -400,16 +382,10 @@
 %obsolete_python_versioned typing
 # python3-xml was merged into python3, now moved into -base
 Provides:       %{python_pkg_name}-xml = %{version}
-%if %{primary_interpreter}
-Provides:       python3-asyncio = %{version}
-Obsoletes:      python3-asyncio < %{version}
-Provides:       python3-base = %{version}
-Obsoletes:      python3-base < %{version}
-Provides:       python3-typing = %{version}
-Obsoletes:      python3-typing < %{version}
-Provides:       python3-xml = %{version}
-Obsoletes:      python3-xml < %{version}
-%endif
+# Explicitly provided because rpm-build-python (which auto-generates this)
+# cannot be installed in the base flavor build root due to a bootstrap cycle:
+# rpm-build-python -> python3-base -> (this package)
+Provides:       python(abi) = %{python_version}
 
 %description -n %{python_pkg_name}-base
 Python is an interpreted, object-oriented programming language, and is
@@ -428,13 +404,6 @@
 Provides:       %{python_pkg_name}-2to3 = %{version}
 Provides:       %{python_pkg_name}-demo = %{version}
 %obsolete_python_versioned tools
-%if %{primary_interpreter}
-Provides:       python3-2to3 = %{version}
-Provides:       python3-demo = %{version}
-Provides:       python3-tools = %{version}
-Obsoletes:      python3-2to3 < %{version}
-Obsoletes:      python3-demo < %{version}
-%endif
 
 %description -n %{python_pkg_name}-tools
 A number of scripts that are useful for building, testing or extending Python,
@@ -444,9 +413,6 @@
 Summary:        Include Files and Libraries Mandatory for Building Python 
Modules
 Requires:       %{python_pkg_name}-base = %{version}
 %obsolete_python_versioned devel
-%if %{primary_interpreter}
-Provides:       python3-devel = %{version}
-%endif
 
 %description -n %{python_pkg_name}-devel
 The Python programming language's interpreter can be extended with
@@ -464,9 +430,6 @@
 Requires:       %{python_pkg_name} = %{version}
 Requires:       %{python_pkg_name}-tk = %{version}
 %obsolete_python_versioned testsuite
-%if %{primary_interpreter}
-Provides:       python3-testsuite = %{version}
-%endif
 
 %description -n %{python_pkg_name}-testsuite
 Unit tests that are useful for verifying integrity and functionality
@@ -757,20 +720,12 @@
 done
 rm -fv %{buildroot}%{dynlib nis}
 
-# overwrite the copied binary with a link
-ln -sf python%{python_version} %{buildroot}%{_bindir}/python3
-
-# decide to ship python3 or just python3.X
-%if !%{primary_interpreter}
-# base
 rm %{buildroot}%{_bindir}/python3
 rm %{buildroot}%{_bindir}/pydoc3
 rm %{buildroot}%{_mandir}/man1/python3.1
-# devel
 rm %{buildroot}%{_bindir}/python3-config
 rm %{buildroot}%{_libdir}/libpython3.so
 rm %{buildroot}%{_libdir}/pkgconfig/{python3,python3-embed}.pc
-%endif
 
 # link shared library instead of static library that tools expect
 ln -s ../../libpython%{python_abi}.so 
%{buildroot}%{_libdir}/python%{python_version}/config-%{python_abi}-%{archname}-%{_os}%{?_gnu}%{?armsuffix}/libpython%{python_abi}.so
@@ -803,7 +758,13 @@
 find "$PDOCS" -name "*.bat" -delete
 
 # put gdb helper script into place
-install -m 755 -D Tools/gdb/libpython.py 
%{buildroot}%{_datadir}/gdb/auto-load/%{_libdir}/libpython%{python_abi}.so.%{so_major}.%{so_minor}-gdb.py
+%define gdb_help_script 
libpython%{python_abi}.so.%{so_major}.%{so_minor}-gdb.py
+install -m 755 -D Tools/gdb/libpython.py \
+    %{buildroot}%{_datadir}/gdb/auto-load/%{_libdir}/%{gdb_help_script}
+# don't use %python310_fix_shebang_path to avoid circular dependency via
+# python-rpm-macros
+sed -i "1s@#\!.*python[^ ]*@#\!%{_bindir}/python%{python_version}@" \
+    %{buildroot}%{_datadir}/gdb/auto-load/%{_libdir}/%{gdb_help_script}
 
 # install devel files to /config
 #cp Makefile Makefile.pre.in Makefile.pre 
$RPM_BUILD_ROOT%{sitedir}/config-%{python_abi}/
@@ -921,16 +882,10 @@
 
 %files -n %{python_pkg_name}-devel
 %{_libdir}/libpython%{python_abi}.so
-%if %{primary_interpreter}
-%{_libdir}/libpython3.so
-%endif
 %{_libdir}/pkgconfig/*
 %{_includedir}/python%{python_abi}
 %{sitedir}/config-%{python_abi}-*
 %{_bindir}/python%{python_abi}-config
-%if %{primary_interpreter}
-%{_bindir}/python3-config
-%endif
 # Own these directories to not depend on gdb
 %dir %{_datadir}/gdb
 %dir %{_datadir}/gdb/auto-load
@@ -960,9 +915,6 @@
 %doc %{_docdir}/%{name}/README.rst
 %license LICENSE
 %doc %{_docdir}/%{name}/README.SUSE
-%if %{primary_interpreter}
-%{_mandir}/man1/python3.1%{?ext_man}
-%endif
 %{_mandir}/man1/python%{python_version}.1%{?ext_man}
 # license text, not a doc because the code can use it at run-time
 %{sitedir}/LICENSE.txt
@@ -1071,11 +1023,6 @@
 # import-failed hooks
 %{sitedir}/_import_failed
 %{sitedir}/site-packages/zzzz-import-failed-hooks.pth
-# symlinks
-%if %{primary_interpreter}
-%{_bindir}/python3
-%{_bindir}/pydoc3
-%endif
 # executables
 %attr(755, root, root) %{_bindir}/pydoc%{python_version}
 # %%attr(755, root, root) %%{_bindir}/python%%{python_abi}

++++++ CVE-2026-3446-base64-padding.patch ++++++
>From bd4ab523ba664863d40470cc718c566158adfa31 Mon Sep 17 00:00:00 2001
From: Serhiy Storchaka <[email protected]>
Date: Tue, 24 Mar 2026 01:20:26 +0200
Subject: [PATCH] [3.14] gh-145264: Do not ignore excess Base64 data after the
 first padded quad (GH-145267) (GH-146326)

Base64 decoder (see binascii.a2b_base64(), base64.b64decode(), etc)
no longer ignores excess data after the first padded quad in non-strict
(default) mode.  Instead, in conformance with RFC 4648, it ignores the
pad character, "=", if it is present before the end of the encoded data.
(cherry picked from commit 4561f6418a691b3e89aef0901f53fe0dfb7f7c0e)
(cherry picked from commit e31c55121620189a0d1a07b689762d8ca9c1b7fa)

Co-authored-by: Serhiy Storchaka <[email protected]>
---
 Lib/test/test_binascii.py                                               |   73 
+++++++
 Misc/NEWS.d/next/Library/2026-02-26-20-13-16.gh-issue-145264.4pggX_.rst |    4 
 Modules/binascii.c                                                      |   93 
+++++++---
 Modules/clinic/binascii.c.h                                             |   35 
+++
 4 files changed, 174 insertions(+), 31 deletions(-)
 create mode 100644 
Misc/NEWS.d/next/Library/2026-02-26-20-13-16.gh-issue-145264.4pggX_.rst

Index: Python-3.10.20/Lib/test/test_binascii.py
===================================================================
--- Python-3.10.20.orig/Lib/test/test_binascii.py       2026-04-17 
17:04:14.901546479 +0200
+++ Python-3.10.20/Lib/test/test_binascii.py    2026-04-17 17:04:14.964546489 
+0200
@@ -14,7 +14,6 @@
                  'unhexlify', 'rledecode_hqx']
 all_functions = a2b_functions + b2a_functions + ['crc32', 'crc_hqx']
 
-
 class BinASCIITest(unittest.TestCase):
 
     type2test = bytes
@@ -114,6 +113,78 @@
         # empty strings. TBD: shouldn't it raise an exception instead ?
         self.assertEqual(binascii.a2b_base64(self.type2test(fillers)), b'')
 
+    def test_base64_strict_mode(self):
+        # Test base64 with strict mode on
+        def _assertRegexTemplate(assert_regex: str, data: bytes, 
non_strict_mode_expected_result: bytes):
+            with self.assertRaisesRegex(binascii.Error, assert_regex):
+                binascii.a2b_base64(self.type2test(data), strict_mode=True)
+            self.assertEqual(binascii.a2b_base64(self.type2test(data), 
strict_mode=False),
+                             non_strict_mode_expected_result)
+            self.assertEqual(binascii.a2b_base64(self.type2test(data)),
+                             non_strict_mode_expected_result)
+
+        def assertExcessData(data, non_strict_mode_expected_result: bytes):
+            _assertRegexTemplate(r'(?i)Excess data', data, 
non_strict_mode_expected_result)
+
+        def assertNonBase64Data(data, non_strict_mode_expected_result: bytes):
+            _assertRegexTemplate(r'(?i)Only base64 data', data, 
non_strict_mode_expected_result)
+
+        def assertLeadingPadding(data, non_strict_mode_expected_result: bytes):
+            _assertRegexTemplate(r'(?i)Leading padding', data, 
non_strict_mode_expected_result)
+
+        def assertDiscontinuousPadding(data, non_strict_mode_expected_result: 
bytes):
+            _assertRegexTemplate(r'(?i)Discontinuous padding', data, 
non_strict_mode_expected_result)
+
+        def assertExcessPadding(data, non_strict_mode_expected_result: bytes):
+            _assertRegexTemplate(r'(?i)Excess padding', data, 
non_strict_mode_expected_result)
+
+        # Test excess data exceptions
+        assertExcessPadding(b'ab===', b'i')
+        assertExcessPadding(b'ab====', b'i')
+        assertNonBase64Data(b'ab==:', b'i')
+        assertExcessData(b'abc=a', b'i\xb7\x1a')
+        assertNonBase64Data(b'abc=:', b'i\xb7')
+        assertNonBase64Data(b'ab==\n', b'i')
+        assertExcessPadding(b'abc==', b'i\xb7')
+        assertExcessPadding(b'abc===', b'i\xb7')
+        assertExcessPadding(b'abc====', b'i\xb7')
+        assertExcessPadding(b'abc=====', b'i\xb7')
+
+        # Test non-base64 data exceptions
+        assertNonBase64Data(b'\nab==', b'i')
+        assertNonBase64Data(b'ab:(){:|:&};:==', b'i')
+        assertNonBase64Data(b'a\nb==', b'i')
+        assertNonBase64Data(b'a\x00b==', b'i')
+
+        # Test malformed padding
+        assertLeadingPadding(b'=', b'')
+        assertLeadingPadding(b'==', b'')
+        assertLeadingPadding(b'===', b'')
+        assertLeadingPadding(b'====', b'')
+        assertLeadingPadding(b'=====', b'')
+        assertDiscontinuousPadding(b'ab=c=', b'i\xb7')
+        assertDiscontinuousPadding(b'ab=ab==', b'i\xb6\x9b')
+        assertExcessPadding(b'abcd=', b'i\xb7\x1d')
+        assertExcessPadding(b'abcd==', b'i\xb7\x1d')
+        assertExcessPadding(b'abcd===', b'i\xb7\x1d')
+        assertExcessPadding(b'abcd====', b'i\xb7\x1d')
+        assertExcessPadding(b'abcd=====', b'i\xb7\x1d')
+
+    def test_base64_excess_data(self):
+        # Test excess data exceptions
+        def assertExcessData(data, expected):
+            assert_regex = r'(?i)Excess data'
+            data = self.type2test(data)
+            with self.assertRaisesRegex(binascii.Error, assert_regex):
+                binascii.a2b_base64(data, strict_mode=True)
+            self.assertEqual(binascii.a2b_base64(data, strict_mode=False),
+                             expected)
+            self.assertEqual(binascii.a2b_base64(data), expected)
+
+        assertExcessData(b'ab==c=', b'i\xb7')
+        assertExcessData(b'ab==cd', b'i\xb7\x1d')
+        assertExcessData(b'abc=d', b'i\xb7\x1d')
+
     def test_base64errors(self):
         # Test base64 with invalid padding
         def assertIncorrectPadding(data):
Index: 
Python-3.10.20/Misc/NEWS.d/next/Library/2026-02-26-20-13-16.gh-issue-145264.4pggX_.rst
===================================================================
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ 
Python-3.10.20/Misc/NEWS.d/next/Library/2026-02-26-20-13-16.gh-issue-145264.4pggX_.rst
      2026-04-17 17:04:14.965334091 +0200
@@ -0,0 +1,4 @@
+Base64 decoder (see :func:`binascii.a2b_base64`, :func:`base64.b64decode`, 
etc) no
+longer ignores excess data after the first padded quad in non-strict
+(default) mode.  Instead, in conformance with :rfc:`4648`, section 3.3, it now 
ignores
+the pad character, "=", if it is present before the end of the encoded data.
Index: Python-3.10.20/Modules/binascii.c
===================================================================
--- Python-3.10.20.orig/Modules/binascii.c      2026-04-17 17:04:14.901546479 
+0200
+++ Python-3.10.20/Modules/binascii.c   2026-04-17 17:04:14.965546490 +0200
@@ -433,18 +433,25 @@
 
     data: ascii_buffer
     /
+    *
+    strict_mode: bool(accept={int}) = False
 
 Decode a line of base64 data.
+
+strict_mode
+  When set to True, bytes that are not part of the base64 standard are not 
allowed.
+  The same applies to excess data after padding (= / ==).
 [clinic start generated code]*/
 
 static PyObject *
-binascii_a2b_base64_impl(PyObject *module, Py_buffer *data)
-/*[clinic end generated code: output=0628223f19fd3f9b input=5872acf6e1cac243]*/
+binascii_a2b_base64_impl(PyObject *module, Py_buffer *data, int strict_mode)
+/*[clinic end generated code: output=5409557788d4f975 input=c0c15fd0f8f9a62d]*/
 {
     assert(data->len >= 0);
 
     const unsigned char *ascii_data = data->buf;
     size_t ascii_len = data->len;
+    binascii_state *state = NULL;
 
     /* Allocate the buffer */
     Py_ssize_t bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later 
*/
@@ -465,20 +472,55 @@
         ** the invalid ones.
         */
         if (this_ch == BASE64_PAD) {
-            if (quad_pos >= 2 && quad_pos + ++pads >= 4) {
-                /* A pad sequence means no more input.
-                ** We've already interpreted the data
-                ** from the quad at this point.
-                */
-                goto done;
+            pads++;
+            if (quad_pos >= 2 && quad_pos + pads <= 4) {
+                continue;
             }
-            continue;
+            // See RFC 4648, section-3.3: "specifications MAY ignore the
+            // pad character, "=", treating it as non-alphabet data, if
+            // it is present before the end of the encoded data" and
+            // "the excess pad characters MAY also be ignored."
+            if (!strict_mode) {
+                continue;
+            }
+            if (quad_pos == 1) {
+                /* Set an error below. */
+                break;
+            }
+            state = get_binascii_state(module);
+            if (state) {
+                PyErr_SetString(state->Error,
+                                (quad_pos == 0 && i == 0)
+                                ? "Leading padding not allowed"
+                                : "Excess padding not allowed");
+            }
+            goto error_end;
         }
 
         this_ch = table_a2b_base64[this_ch];
         if (this_ch >= 64) {
+            // See RFC 4648, section-3.3.
+            if (strict_mode) {
+                state = get_binascii_state(module);
+                if (state) {
+                    PyErr_SetString(state->Error, "Only base64 data is 
allowed");
+                }
+                goto error_end;
+            }
             continue;
         }
+
+        // Characters that are not '=', in the middle of the padding, are
+        // not allowed (except when they are). See RFC 4648, section-3.3.
+        if (pads && strict_mode) {
+            state = get_binascii_state(module);
+            if (state) {
+                PyErr_SetString(state->Error, (quad_pos + pads == 4)
+                    ? "Excess data after padding"
+                    : "Discontinuous padding not allowed");
+            }
+            goto error_end;
+        }
         pads = 0;
 
         switch (quad_pos) {
@@ -504,30 +546,35 @@
         }
     }
 
-    if (quad_pos != 0) {
-        binascii_state *state = PyModule_GetState(module);
-        if (state == NULL) {
-            /* error already set, from PyModule_GetState */
-        } else if (quad_pos == 1) {
-            /*
-            ** There is exactly one extra valid, non-padding, base64 character.
-            ** This is an invalid length, as there is no possible input that
-            ** could encoded into such a base64 string.
-            */
+    if (quad_pos == 1) {
+        /* There is exactly one extra valid, non-padding, base64 character.
+         * * This is an invalid length, as there is no possible input that
+         ** could encoded into such a base64 string.
+         */
+        state = get_binascii_state(module);
+        if (state) {
             PyErr_Format(state->Error,
                          "Invalid base64-encoded string: "
                          "number of data characters (%zd) cannot be 1 more "
                          "than a multiple of 4",
                          (bin_data - bin_data_start) / 3 * 4 + 1);
-        } else {
+        }
+        goto error_end;
+    }
+
+    if (quad_pos != 0 && quad_pos + pads < 4) {
+        state = get_binascii_state(module);
+        if (state) {
             PyErr_SetString(state->Error, "Incorrect padding");
         }
-        _PyBytesWriter_Dealloc(&writer);
-        return NULL;
+        goto error_end;
     }
 
-done:
     return _PyBytesWriter_Finish(&writer, bin_data);
+
+error_end:
+    _PyBytesWriter_Dealloc(&writer);
+    return NULL;
 }
 
 
Index: Python-3.10.20/Modules/clinic/binascii.c.h
===================================================================
--- Python-3.10.20.orig/Modules/clinic/binascii.c.h     2026-04-17 
17:05:53.040592728 +0200
+++ Python-3.10.20/Modules/clinic/binascii.c.h  2026-04-17 17:04:14.901546479 
+0200
@@ -87,27 +87,48 @@
 }
 
 PyDoc_STRVAR(binascii_a2b_base64__doc__,
-"a2b_base64($module, data, /)\n"
+"a2b_base64($module, data, /, *, strict_mode=False)\n"
 "--\n"
 "\n"
-"Decode a line of base64 data.");
+"Decode a line of base64 data.\n"
+"\n"
+"strict_mode\n"
+"  When set to True, bytes that are not part of the base64 standard are not 
allowed.\n"
+"  The same applies to excess data after padding (= / ==).");
 
 #define BINASCII_A2B_BASE64_METHODDEF    \
-    {"a2b_base64", (PyCFunction)binascii_a2b_base64, METH_O, 
binascii_a2b_base64__doc__},
+    {"a2b_base64", (PyCFunction)(void(*)(void))binascii_a2b_base64, 
METH_FASTCALL|METH_KEYWORDS, binascii_a2b_base64__doc__},
 
 static PyObject *
-binascii_a2b_base64_impl(PyObject *module, Py_buffer *data);
+binascii_a2b_base64_impl(PyObject *module, Py_buffer *data, int strict_mode);
 
 static PyObject *
-binascii_a2b_base64(PyObject *module, PyObject *arg)
+binascii_a2b_base64(PyObject *module, PyObject *const *args, Py_ssize_t nargs, 
PyObject *kwnames)
 {
     PyObject *return_value = NULL;
+    static const char * const _keywords[] = {"", "strict_mode", NULL};
+    static _PyArg_Parser _parser = {NULL, _keywords, "a2b_base64", 0};
+    PyObject *argsbuf[2];
+    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 
1;
     Py_buffer data = {NULL, NULL};
+    int strict_mode = 0;
 
-    if (!ascii_buffer_converter(arg, &data)) {
+    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 
0, argsbuf);
+    if (!args) {
+        goto exit;
+    }
+    if (!ascii_buffer_converter(args[0], &data)) {
+        goto exit;
+    }
+    if (!noptargs) {
+        goto skip_optional_kwonly;
+    }
+    strict_mode = _PyLong_AsInt(args[1]);
+    if (strict_mode == -1 && PyErr_Occurred()) {
         goto exit;
     }
-    return_value = binascii_a2b_base64_impl(module, &data);
+skip_optional_kwonly:
+    return_value = binascii_a2b_base64_impl(module, &data, strict_mode);
 
 exit:
     /* Cleanup for data */

++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.hpiQZJ/_old  2026-04-19 14:21:23.638167276 +0200
+++ /var/tmp/diff_new_pack.hpiQZJ/_new  2026-04-19 14:21:23.650167764 +0200
@@ -1,6 +1,6 @@
-mtime: 1775598785
-commit: 4fc13a033e0810c657738f5966755e3e5a2f0efa24bed607d38e1d5465b0afd7
+mtime: 1776458219
+commit: cf8e710a886c417bb4b2c136e2a8fc01cac6f38e333eca36fc60ab1547011bba
 url: https://src.opensuse.org/python-interpreters/python310.git
-revision: 4fc13a033e0810c657738f5966755e3e5a2f0efa24bed607d38e1d5465b0afd7
+revision: cf8e710a886c417bb4b2c136e2a8fc01cac6f38e333eca36fc60ab1547011bba
 projectscmsync: https://src.opensuse.org/python-interpreters/_ObsPrj
 

++++++ build.specials.obscpio ++++++

++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore      2026-04-17 22:37:34.000000000 +0200
@@ -0,0 +1,7 @@
+.osc
+*.obscpio
+*.osc
+_build.*
+.pbuild
+*.rej
+python310-*-build/

Reply via email to