From cb938aa128dfec91e84d4168d6ee6d2010cbcfc1 Mon Sep 17 00:00:00 2001 From: Levi Neely <141506390+lneely@users.noreply.github.com> Date: Tue, 3 Mar 2026 16:10:18 +0100 Subject: [PATCH] Fix memory leak in pfs_update_openfile on collision (#327) File operations tested, no regression --- pclsync/pfs.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/pclsync/pfs.c b/pclsync/pfs.c index 7dd96b6..83da3ef 100644 --- a/pclsync/pfs.c +++ b/pclsync/pfs.c @@ -220,11 +220,34 @@ int pfs_update_openfile(uint64_t taskid, uint64_t writeid, else break; } else { - pdbg_logf(D_BUG, "found already open file %lu, should not happen", + pdbg_logf(D_BUG, "found already open file %lu, re-inserting old fileid", (unsigned long)newfileid); - break; + tr = openfiles; + d = -1; + while (tr) { + d = fileid - ptree_element(tr, psync_openfile_t, tree)->fileid; + if (d < 0) { + if (tr->left) + tr = tr->left; + else + break; + } else if (d > 0) { + if (tr->right) + tr = tr->right; + else + break; + } else + break; + } + if (d < 0) + ptree_add_before(&openfiles, tr, &fl->tree); + else + ptree_add_after(&openfiles, tr, &fl->tree); + ret = -1; + goto unlock_ret; } } + fl->fileid = newfileid; if (d < 0) ptree_add_before(&openfiles, tr, &fl->tree); else @@ -243,6 +266,7 @@ int pfs_update_openfile(uint64_t taskid, uint64_t writeid, } ret = -1; } +unlock_ret: pthread_mutex_unlock(&fl->mutex); psql_unlock(); return ret;