From: Stefan Hajnoczi <stefa...@redhat.com> Hold the lock across both lo_map_get() and lo_map_remove() to prevent races between two FUSE_RELEASE requests. In this case I don't see a serious bug but it's safer to do things atomically.
Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> Reviewed-by: Daniel P. Berrangé <berra...@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> --- tools/virtiofsd/passthrough_ll.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tools/virtiofsd/passthrough_ll.c b/tools/virtiofsd/passthrough_ll.c index 9414935b52..690edbc4c5 100644 --- a/tools/virtiofsd/passthrough_ll.c +++ b/tools/virtiofsd/passthrough_ll.c @@ -1772,14 +1772,18 @@ static void lo_release(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) { struct lo_data *lo = lo_data(req); - int fd; + struct lo_map_elem *elem; + int fd = -1; (void)ino; - fd = lo_fi_fd(req, fi); - pthread_mutex_lock(&lo->mutex); - lo_map_remove(&lo->fd_map, fi->fh); + elem = lo_map_get(&lo->fd_map, fi->fh); + if (elem) { + fd = elem->fd; + elem = NULL; + lo_map_remove(&lo->fd_map, fi->fh); + } pthread_mutex_unlock(&lo->mutex); close(fd); -- 2.24.1