Fix race condition in pfs_dec_of_refcnt

Call pfs_free_openfile() before releasing locks to prevent
another thread from accessing freed memory between unlock and free.

Fixes #257
This commit is contained in:
Levi Neely 2026-03-03 16:11:52 +01:00
parent cb938aa128
commit c551b08f88
1 changed files with 7 additions and 4 deletions

View File

@ -1782,12 +1782,15 @@ void pfs_dec_of_refcnt(psync_openfile_t *of) {
uint32_t refcnt;
pfs_get_both_locks(of);
refcnt = --of->refcnt;
if (!refcnt)
if (!refcnt) {
ptree_del(&openfiles, &of->tree);
psql_unlock();
pthread_mutex_unlock(&of->mutex);
if (!refcnt)
psql_unlock();
pthread_mutex_unlock(&of->mutex);
pfs_free_openfile(of);
} else {
psql_unlock();
pthread_mutex_unlock(&of->mutex);
}
}
void pfs_inc_of_refcnt_and_readers(psync_openfile_t *of) {