Fix drivers modifying memory during set_memory()

This has been a warning for a while, so most of the popular drivers
are fixed by now. This fixes the two remaining (obvious) ones and adds
a test to prevent more from being added.

Note that there may be some that still only modify the memory in
edge cases that this test doesn't cover.
This commit is contained in:
Dan Smith 2026-03-16 16:56:30 -07:00 committed by Dan Smith
parent 59f2673c65
commit 8b6366e0e4
4 changed files with 12 additions and 16 deletions

View file

@ -645,11 +645,7 @@ class Kenwood_P60_Radio(chirp_common.CloneModeRadio, chirp_common.ExperimentalRa
self.encode_tone(_mem.tx_tone, txmode, txtone, txpol)
self.encode_tone(_mem.rx_tone, rxmode, rxtone, rxpol)
# power, default power is high, as the low is configurable via a key
if mem.power is None:
mem.power = POWER_LEVELS[1]
_mem.power = POWER_LEVELS.index(mem.power)
_mem.power = POWER_LEVELS.index(mem.power or POWER_LEVELS[1])
# skip
self.set_scan(mem.number - 1, mem.skip)

View file

@ -1073,12 +1073,7 @@ class Kenwood_Series_60G(chirp_common.CloneModeRadio,
except IndexError:
_mem.name[i] = "\x20"
# power
# default power is low
if mem.power is None:
mem.power = POWER_LEVELS[0]
_mem.power = POWER_LEVELS.index(mem.power)
_mem.power = POWER_LEVELS.index(mem.power or POWER_LEVELS[0])
# wide/marrow
_mem.wide = MODES.index(mem.mode)

View file

@ -866,17 +866,18 @@ class VX1RadioCG1(VX1Radio):
return mem
def set_memory(self, mem):
if isinstance(mem.number, str):
number = mem.number
if isinstance(number, str):
# Convert string to number
mem.number = self.SPECIAL_MEMORIES[mem.number]
number = self.SPECIAL_MEMORIES[mem.number]
# Map CG1 subdevice number to cg1_idx
if mem.number <= 72:
if number <= 72:
# Regular and L/U memories: 1-72 map to cg1_idx 8-79
cg1_idx = mem.number + 7
cg1_idx = number + 7
else:
# Home channels: 73-80 map to cg1_idx 0-7
cg1_idx = mem.number - 73
cg1_idx = number - 73
# Handle CG1 memory structure directly
_mem = self._memobj.cg1_memory[cg1_idx]

View file

@ -37,6 +37,10 @@ class TestCaseEdges(base.DriverTest):
n = self.radio.get_memory(m.number)
self.assertEqualMem(m, n)
def test_set_does_not_modify_input(self):
m = self.get_mem()
self.radio.set_memory(chirp_common.FrozenMemory(m))
def test_bandedges(self):
m = self.get_mem()
min_step = min(self.rf.has_tuning_step and