Update pack.cc (#1685)

This fixes a memory issue. When you assign to base_iodelay_rules from itself, the LHS when you do `base_iodelay_rules[id_DELAYA] = base_iodelay_rules[id_DELAYB]`, can cause a heap allocation which possibly invalidates the memory of the RHS. 

This was found while running nextpnr under ASAN. It might be useful to add testing under libasan into CI.
This commit is contained in:
jdavidberger 2026-04-02 12:53:07 -06:00 committed by GitHub
parent c6b876fc85
commit b8c350b3e4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 6 additions and 4 deletions

View File

@ -1232,10 +1232,12 @@ struct NexusPacker
dict<IdString, XFormRule> base_iodelay_rules;
base_iodelay_rules[id_DELAYB].new_type = id_IOLOGIC;
base_iodelay_rules[id_DELAYB].param_xform[id_DEL_VALUE] = ctx->id("DELAY.DEL_VALUE");
base_iodelay_rules[id_DELAYB].param_xform[id_COARSE_DELAY] = ctx->id("DELAY.COARSE_DELAY");
base_iodelay_rules[id_DELAYA] = base_iodelay_rules[id_DELAYB];
XFormRule delay_rule;
delay_rule.param_xform[id_DEL_VALUE] = ctx->id("DELAY.DEL_VALUE");
delay_rule.param_xform[id_COARSE_DELAY] = ctx->id("DELAY.COARSE_DELAY");
base_iodelay_rules[id_DELAYB] = delay_rule;
base_iodelay_rules[id_DELAYA] = delay_rule;
base_iodelay_rules[id_DELAYA].param_xform[id_COARSE_DELAY_MODE] = ctx->id("DELAY.COARSE_DELAY_MODE");
base_iodelay_rules[id_DELAYA].param_xform[id_EDGE_MONITOR] = ctx->id("DELAY.EDGE_MONITOR");