From fd83fbdb5f9ec33d4ec5850c1487727e8f4153f2 Mon Sep 17 00:00:00 2001 From: Eric Wild Date: Wed, 23 Sep 2026 17:51:04 +0200 Subject: [PATCH] sms: don't mutate digits in AddressField.to_bytes() to_bytes() appended the BCD filler nibble, so the next call saw one digit more and derived a wrong length. This affects any code that encodes an address twice, even for printing/logging. Man, I really miss my beloved c++ const function decoration... Fix: keep the filler in a local. Change-Id: I81691c5a1fc5072d6d20c52d22da1eb2e180d04a --- pySim/sms.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pySim/sms.py b/pySim/sms.py index 75a9bde1..55afbb70 100644 --- a/pySim/sms.py +++ b/pySim/sms.py @@ -246,8 +246,8 @@ class AddressField: def to_bytes(self) -> bytes: """Encode the AddressField into the binary representation as used in T-PDU.""" num_digits = len(self.digits) - if num_digits % 2: - self.digits += 'f' + # don't store the filler nibble or get_bytes() encodes it as digit and ends up too large + digits = self.digits + 'f' if num_digits % 2 else self.digits d = { 'addr_len': num_digits, 'type_of_addr': { @@ -255,7 +255,7 @@ class AddressField: 'type_of_number': self.ton, 'numbering_plan_id': self.npi, }, - 'digits': self.digits, + 'digits': digits, } return self._construct.build(d)