diff --git a/qrcode/main.py b/qrcode/main.py index 593c581b..929ef120 100644 --- a/qrcode/main.py +++ b/qrcode/main.py @@ -523,11 +523,11 @@ def get_matrix(self): return self.modules width = len(self.modules) + self.border * 2 - code = [[False] * width] * self.border + code = [[False] * width for _ in range(self.border)] x_border = [False] * self.border for module in self.modules: code.append(x_border + cast("list[bool]", module) + x_border) - code += [[False] * width] * self.border + code += [[False] * width for _ in range(self.border)] return code diff --git a/qrcode/tests/test_qrcode.py b/qrcode/tests/test_qrcode.py index a98f8724..285ee21f 100644 --- a/qrcode/tests/test_qrcode.py +++ b/qrcode/tests/test_qrcode.py @@ -43,8 +43,7 @@ def test_glog_zero_binary_data_at_capacity(): # Version 5 + Q = 60 bytes capacity, data padded with trailing null bytes data = ( b"\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x16" - b"Hello from kakaworld!!" - + b"\x00" * 26 + b"Hello from kakaworld!!" + b"\x00" * 26 ) assert len(data) == 60 qr = qrcode.QRCode(version=5, error_correction=qrcode.constants.ERROR_CORRECT_Q) @@ -303,6 +302,32 @@ def test_get_matrix_border(): assert matrix == qr.modules +def test_get_matrix_border_rows_not_aliased(): + # With border > 1, each border row must be a distinct list object so that + # mutating one row does not corrupt the others. + qr = qrcode.QRCode(border=4) + qr.add_data("1") + matrix = qr.get_matrix() + border = qr.border + top_rows = matrix[:border] + bottom_rows = matrix[-border:] + # Every pair of top border rows must be distinct objects. + for i in range(border): + for j in range(i + 1, border): + assert top_rows[i] is not top_rows[j], ( + f"Top border rows {i} and {j} are the same object (aliased)" + ) + # Every pair of bottom border rows must be distinct objects. + for i in range(border): + for j in range(i + 1, border): + assert bottom_rows[i] is not bottom_rows[j], ( + f"Bottom border rows {i} and {j} are the same object (aliased)" + ) + # All border rows must contain only False values. + for row in top_rows + bottom_rows: + assert row == [False] * len(row) + + def test_negative_size_at_construction(): with pytest.raises(ValueError): qrcode.QRCode(box_size=-1)