Concurrent reads of a burn_after_read paste can all succeed before SoftDelete lands. Verified in #34: 4/6 concurrent API readers received content. Check-then-delete in registerRead is not atomic.
Fix: atomic conditional UPDATE (deleted_at WHERE id=? AND deleted_at IS NULL) checked via RowsAffected before returning content, or a reads_used conditional guard for burn-after-N.
Split from #34 (MED).
Concurrent reads of a burn_after_read paste can all succeed before SoftDelete lands. Verified in #34: 4/6 concurrent API readers received content. Check-then-delete in registerRead is not atomic.
Fix: atomic conditional UPDATE (deleted_at WHERE id=? AND deleted_at IS NULL) checked via RowsAffected before returning content, or a reads_used conditional guard for burn-after-N.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Split from #34 (MED).
Concurrent reads of a burn_after_read paste can all succeed before SoftDelete lands. Verified in #34: 4/6 concurrent API readers received content. Check-then-delete in registerRead is not atomic.
Fix: atomic conditional UPDATE (deleted_at WHERE id=? AND deleted_at IS NULL) checked via RowsAffected before returning content, or a reads_used conditional guard for burn-after-N.