bpo-34736: improve error message for invalid length b64decode inputs (GH-9563)


Improvements:
1. Include the number of valid data characters in the error message.
2. Mention "number of data characters" rather than "length".

https://bugs.python.org/issue34736
(cherry picked from commit 1fba2ffc37da52c08db51fe4360459990b0311c9)

Co-authored-by: Tal Einat <taleinat+github@gmail.com>
diff --git a/Modules/binascii.c b/Modules/binascii.c
index 2df80af..d0d3f7d 100644
--- a/Modules/binascii.c
+++ b/Modules/binascii.c
@@ -438,6 +438,7 @@
 {
     const unsigned char *ascii_data;
     unsigned char *bin_data;
+    unsigned char *bin_data_start;
     int leftbits = 0;
     unsigned char this_ch;
     unsigned int leftchar = 0;
@@ -461,6 +462,7 @@
     bin_data = _PyBytesWriter_Alloc(&writer, bin_len);
     if (bin_data == NULL)
         return NULL;
+    bin_data_start = bin_data;
 
     for( ; ascii_len > 0; ascii_len--, ascii_data++) {
         this_ch = *ascii_data;
@@ -516,9 +518,11 @@
             ** This is an invalid length, as there is no possible input that
             ** could encoded into such a base64 string.
             */
-            PyErr_SetString(Error,
-                            "Invalid base64-encoded string: "
-                            "length cannot be 1 more than a multiple of 4");
+            PyErr_Format(Error,
+                         "Invalid base64-encoded string: "
+                         "number of data characters (%d) cannot be 1 more "
+                         "than a multiple of 4",
+                         (bin_data - bin_data_start) / 3 * 4 + 1);
         } else {
             PyErr_SetString(Error, "Incorrect padding");
         }