fix: memory-safety and playback regressions found via ASan

- nodeparamview: add visited set to get_distance_between_nodes, fixing
  unbounded recursion (stack overflow) when the node graph has a cycle
- viewerdisplay: give texture_ a consistent owner via assign_texture();
  borrowed queue textures are now retained, created ones freed, fixing
  a dangling pointer that corrupted the heap and crashed in the GL driver
- playbackcache: resignal_requests() iterates a copy, handlers may
  clear_request_range() while iterating (ASan container-overflow)
- preview C API: preview request ticket lambdas captured the request
  state raw; after oakengine_preview_request_free the ticket outlived
  the request and the finished callback wrote into freed memory
  (heap-use-after-free). The finished flag is now a shared_ptr captured
  weakly by the callbacks
- playback: oak_playback_frame regains a timestamp (num/den) filled
  from olive::Frame; the viewer queue append no longer uses Rational()
  for every frame, which made append_timewise drop all but the first
  frame and froze the picture during playback
- mainwindow: open_node_in_viewer refuses sequence nodes; sequences
  already have the Sequence Viewer, and saved layouts could otherwise
  resurrect a redundant floating Viewer bound to the sequence
This commit is contained in:
2026-08-01 19:14:31 +08:00
parent 66d761b4b7
commit a4dfc62f0f
8 changed files with 120 additions and 30 deletions
+4 -1
View File
@@ -131,7 +131,10 @@ public:
void resignal_requests()
{
for (const TimeRange &r : requested_) {
// Iterate over a copy: handlers may call clear_request_range() and
// mutate requested_ while we're iterating it.
const TimeRangeList requests = requested_;
for (const TimeRange &r : requests) {
emit requested(request_context_, r);
}
}