243s left: `"TokenInfo {\n label: \"Token Label\",\n manufacturer_id: \"Manufacturer ID\",\n model: \"Token Model\",\n serial_number: \"Serial Number\",\n flags: (empty),\n max_session_count: Max(\n 100,\n ),\n session_count: None,\n max_rw_session_count: Infinite,\n rw_session_count: Some(\n 1,\n ),\n max_pin_len: 16,\n min_pin_len: 4,\n total_public_memory: Some(\n 0,\n ),\n free_public_memory: Some(\n 1234567890,\n ),\n total_private_memory: None,\n free_private_memory: None,\n hardware_version: Version {\n major: 0,\n minor: 255,\n },\n firmware_version: Version {\n major: 255,\n minor: 0,\n },\n utc_time: Some(\n UtcTime {\n year: 1970,\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n },\n ),\n}"`,
243s right: `"TokenInfo {\n label: \"Token Label\",\n manufacturer_id: \"Manufacturer ID\",\n model: \"Token Model\",\n serial_number: \"Serial Number\",\n flags: (empty),\n max_session_count: Max(\n 100,\n ),\n session_count: None,\n max_rw_session_count: Infinite,\n rw_session_count: Some(\n 1,\n ),\n max_pin_len: 16,\n min_pin_len: 4,\n total_public_memory: Some(\n 34359738368,\n ),\n free_public_memory: Some(\n 1234567890,\n ),\n total_private_memory: None,\n free_private_memory: None,\n hardware_version: Version {\n major: 0,\n minor: 255,\n },\n firmware_version: Version {\n major: 255,\n minor: 0,\n },\n utc_time: Some(\n UtcTime {\n year: 1970,\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n },\n ),\n}"`', src/slot/token_info.rs:551:9
The culprit seems to be.
total_public_memory: Some(32 << 30),
total_public_memory is an Option, so on 32-bit architectures this results in a value of zero. Rust does not consider this to be an overflow due to the way overflow is defined for shift operators (which is different from how it is defined for arithmetic operators).
In Debian I simply patched the test to use a smaller value.