virtiofsd: make lo_release() atomic

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 <stefanha@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2019-07-26 10:11:01 +01:00 committed by Dr. David Alan Gilbert
parent e7b337326d
commit baed65c060
1 changed files with 8 additions and 4 deletions

View File

@ -1772,14 +1772,18 @@ static void lo_release(fuse_req_t req, fuse_ino_t ino,
struct fuse_file_info *fi) struct fuse_file_info *fi)
{ {
struct lo_data *lo = lo_data(req); struct lo_data *lo = lo_data(req);
int fd; struct lo_map_elem *elem;
int fd = -1;
(void)ino; (void)ino;
fd = lo_fi_fd(req, fi);
pthread_mutex_lock(&lo->mutex); 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); pthread_mutex_unlock(&lo->mutex);
close(fd); close(fd);