Skip to content

Commit 43d811c

Browse files
authored
Merge pull request RustPython#3771 from isac322/fix_test_b64decode_padding_error
fix(binascii): a2b_base64() raises on non padded input
2 parents ee4efd4 + 3bbd590 commit 43d811c

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

Lib/test/test_base64.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,6 @@ def test_b64decode(self):
235235
b'\xd3V\xbeo\xf7\x1d')
236236
self.check_decode_type_errors(base64.urlsafe_b64decode)
237237

238-
# TODO: RUSTPYTHON
239-
@unittest.expectedFailure
240238
def test_b64decode_padding_error(self):
241239
self.assertRaises(binascii.Error, base64.b64decode, b'abc')
242240
self.assertRaises(binascii.Error, base64.b64decode, 'abc')

stdlib/src/binascii.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ pub(super) use decl::crc32;
55
#[pymodule(name = "binascii")]
66
mod decl {
77
use crate::vm::{
8-
builtins::{PyIntRef, PyTypeRef},
8+
builtins::{PyBaseExceptionRef, PyIntRef, PyTypeRef},
99
function::{ArgAsciiBuffer, ArgBytesLike, OptionalArg},
1010
PyResult, VirtualMachine,
1111
};
@@ -93,6 +93,10 @@ mod decl {
9393
newline: bool,
9494
}
9595

96+
fn new_binascii_error(msg: String, vm: &VirtualMachine) -> PyBaseExceptionRef {
97+
vm.new_exception_msg(error_type(vm), msg)
98+
}
99+
96100
#[pyfunction]
97101
fn a2b_base64(s: ArgAsciiBuffer, vm: &VirtualMachine) -> PyResult<Vec<u8>> {
98102
s.with_ref(|b| {
@@ -104,9 +108,12 @@ mod decl {
104108
} else {
105109
b
106110
};
111+
if b.len() % 4 != 0 {
112+
return Err(base64::DecodeError::InvalidLength);
113+
}
107114
base64::decode(b)
108115
})
109-
.map_err(|err| vm.new_value_error(format!("error decoding base64: {}", err)))
116+
.map_err(|err| new_binascii_error(format!("error decoding base64: {}", err), vm))
110117
}
111118

112119
#[pyfunction]

0 commit comments

Comments
 (0)