diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 634c99b17..86164dd82 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -235,8 +235,6 @@ class BaseXYTestCase(unittest.TestCase): b'\xd3V\xbeo\xf7\x1d') self.check_decode_type_errors(base64.urlsafe_b64decode) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_b64decode_padding_error(self): self.assertRaises(binascii.Error, base64.b64decode, b'abc') self.assertRaises(binascii.Error, base64.b64decode, 'abc') diff --git a/stdlib/src/binascii.rs b/stdlib/src/binascii.rs index 5dad5dce0..3f72eee3b 100644 --- a/stdlib/src/binascii.rs +++ b/stdlib/src/binascii.rs @@ -5,7 +5,7 @@ pub(super) use decl::crc32; #[pymodule(name = "binascii")] mod decl { use crate::vm::{ - builtins::{PyIntRef, PyTypeRef}, + builtins::{PyBaseExceptionRef, PyIntRef, PyTypeRef}, function::{ArgAsciiBuffer, ArgBytesLike, OptionalArg}, PyResult, VirtualMachine, }; @@ -93,6 +93,10 @@ mod decl { newline: bool, } + fn new_binascii_error(msg: String, vm: &VirtualMachine) -> PyBaseExceptionRef { + vm.new_exception_msg(error_type(vm), msg) + } + #[pyfunction] fn a2b_base64(s: ArgAsciiBuffer, vm: &VirtualMachine) -> PyResult> { s.with_ref(|b| { @@ -104,9 +108,12 @@ mod decl { } else { b }; + if b.len() % 4 != 0 { + return Err(base64::DecodeError::InvalidLength); + } base64::decode(b) }) - .map_err(|err| vm.new_value_error(format!("error decoding base64: {}", err))) + .map_err(|err| new_binascii_error(format!("error decoding base64: {}", err), vm)) } #[pyfunction]