Skip to content

add move semantics for message media references#7517

Open
Goober5000 wants to merge 1 commit into
scp-fs2open:masterfrom
Goober5000:fix/message_move
Open

add move semantics for message media references#7517
Goober5000 wants to merge 1 commit into
scp-fs2open:masterfrom
Goober5000:fix/message_move

Conversation

@Goober5000

Copy link
Copy Markdown
Contributor

MMessage's avi_info/wave_info unions hold strdup'd filenames in FRED (indices in the game), but moves copied the pointers without nulling the source, so every vector shift on Messages left moved-from elements aliasing live allocations -- one careless edit away from a double-free.

Wrap each union in a MessageMediaRef struct whose moves null the source and whose copies stay shallow (the event editor's backup pattern copies then re-strdups). MMessage keeps its implicit copy and gains a correct implicit move; access syntax at all use sites is unchanged.

Add a message_free_media_names() helper and use it at the FRED delete/wipe sites. Two fixes ride along: messages_init() now frees mission messages' media names before discarding them, closing a leak that fired on every mission load in FRED; and the message editor's OnDelete now uses the move-based array_remove_slot instead of a copy-shift that left a stale aliasing tail.

No destructor: the active union member depends on Fred_running, and shallow copies alias, so freeing remains explicit.

MMessage's avi_info/wave_info unions hold strdup'd filenames in FRED
(indices in the game), but moves copied the pointers without nulling
the source, so every vector shift on Messages left moved-from elements
aliasing live allocations -- one careless edit away from a double-free.

Wrap each union in a MessageMediaRef struct whose moves null the source
and whose copies stay shallow (the event editor's backup pattern copies
then re-strdups).  MMessage keeps its implicit copy and gains a correct
implicit move; access syntax at all use sites is unchanged.

Add a message_free_media_names() helper and use it at the FRED
delete/wipe sites.  Two fixes ride along: messages_init() now frees
mission messages' media names before discarding them, closing a leak
that fired on every mission load in FRED; and the message editor's
OnDelete now uses the move-based array_remove_slot instead of a
copy-shift that left a stale aliasing tail.

No destructor: the active union member depends on Fred_running, and
shallow copies alias, so freeing remains explicit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Goober5000 Goober5000 added cleanup A modification or rewrite of code to make it more understandable or easier to maintain. fix A fix for bugs, not-a-bugs, and/or regressions. labels Jun 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cleanup A modification or rewrite of code to make it more understandable or easier to maintain. fix A fix for bugs, not-a-bugs, and/or regressions.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants