RetroAchievements / rcheevos

Library to parse and evaluate achievements and leaderboards for RetroAchievements
MIT License
86 stars 33 forks source link

fix infinite loop if reset occurs just prior to a ping while progress indicator is on screen #354

Closed Jamiras closed 1 month ago

Jamiras commented 1 month ago

When calling rc_client_reset with a progress indicator on screen, the progress indicator is immediately hidden and the scheduled event to hide it is removed from the queue. This is done by changing it's scheduled time to 0. Since the queue is sorted, the scan to remove the item stops as soon as an item is found with a higher scheduled time. As a result, if the event is not the first item in the queue, it's not removed. Instead, it gets reinserted as the first item, pointing at the previous first item, which is still pointing at the chain that is pointing at it. The next time the queue is updated, there's a potential infinite loop as it looks for a place to insert the new item.