Browse Source

Merge pull request #1170 from trapexit/fuse_destroy

Fix crash when exiting with open deleted files
pull/1171/head
trapexit 2 years ago
committed by GitHub
parent
commit
c681d6c2fe
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 35
      libfuse/lib/fuse.c

35
libfuse/lib/fuse.c

@ -178,7 +178,6 @@ struct node
struct lock *locks; struct lock *locks;
uint32_t stat_crc32b; uint32_t stat_crc32b;
uint8_t is_hidden:1;
uint8_t is_stat_cache_valid:1; uint8_t is_stat_cache_valid:1;
}; };
@ -407,7 +406,7 @@ free_node(struct fuse *f_,
{ {
filename_free(f_,node_->name); filename_free(f_,node_->name);
if(node_->is_hidden)
if(node_->hidden_fh)
f_->fs->op.free_hide(node_->hidden_fh); f_->fs->op.free_hide(node_->hidden_fh);
free_node_mem(f_,node_); free_node_mem(f_,node_);
@ -1715,7 +1714,7 @@ fuse_lib_getattr(fuse_req_t req,
{ {
pthread_mutex_lock(&f->lock); pthread_mutex_lock(&f->lock);
node = get_node(f,hdr_->nodeid); node = get_node(f,hdr_->nodeid);
if(node->is_hidden)
if(node->hidden_fh)
ffi.fh = node->hidden_fh; ffi.fh = node->hidden_fh;
pthread_mutex_unlock(&f->lock); pthread_mutex_unlock(&f->lock);
} }
@ -1778,7 +1777,7 @@ fuse_lib_setattr(fuse_req_t req,
{ {
pthread_mutex_lock(&f->lock); pthread_mutex_lock(&f->lock);
node = get_node(f,hdr_->nodeid); node = get_node(f,hdr_->nodeid);
if(node->is_hidden)
if(node->hidden_fh)
{ {
fi = &ffi; fi = &ffi;
fi->fh = node->hidden_fh; fi->fh = node->hidden_fh;
@ -2031,11 +2030,7 @@ fuse_lib_unlink(fuse_req_t req,
{ {
pthread_mutex_lock(&f->lock); pthread_mutex_lock(&f->lock);
if(node_open(wnode)) if(node_open(wnode))
{
err = f->fs->op.prepare_hide(path,&wnode->hidden_fh); err = f->fs->op.prepare_hide(path,&wnode->hidden_fh);
if(!err)
wnode->is_hidden = 1;
}
pthread_mutex_unlock(&f->lock); pthread_mutex_unlock(&f->lock);
err = f->fs->op.unlink(path); err = f->fs->op.unlink(path);
@ -2131,11 +2126,7 @@ fuse_lib_rename(fuse_req_t req,
{ {
pthread_mutex_lock(&f->lock); pthread_mutex_lock(&f->lock);
if(node_open(wnode2)) if(node_open(wnode2))
{
err = f->fs->op.prepare_hide(newpath,&wnode2->hidden_fh); err = f->fs->op.prepare_hide(newpath,&wnode2->hidden_fh);
if(!err)
wnode2->is_hidden = 1;
}
pthread_mutex_unlock(&f->lock); pthread_mutex_unlock(&f->lock);
err = f->fs->op.rename(oldpath,newpath); err = f->fs->op.rename(oldpath,newpath);
@ -2187,27 +2178,28 @@ fuse_do_release(struct fuse *f,
uint64_t ino, uint64_t ino,
fuse_file_info_t *fi) fuse_file_info_t *fi)
{ {
struct node *node;
uint64_t fh; uint64_t fh;
int was_hidden;
struct node *node;
fh = 0; fh = 0;
f->fs->op.release(fi); f->fs->op.release(fi);
pthread_mutex_lock(&f->lock); pthread_mutex_lock(&f->lock);
{
node = get_node(f,ino); node = get_node(f,ino);
assert(node->open_count > 0); assert(node->open_count > 0);
node->open_count--; node->open_count--;
was_hidden = 0;
if(node->is_hidden && (node->open_count == 0))
if(node->hidden_fh && (node->open_count == 0))
{ {
was_hidden = 1;
node->is_hidden = 0;
fh = node->hidden_fh; fh = node->hidden_fh;
node->hidden_fh = 0;
}
} }
pthread_mutex_unlock(&f->lock); pthread_mutex_unlock(&f->lock);
if(was_hidden)
if(fh)
f->fs->op.free_hide(fh); f->fs->op.free_hide(fh);
} }
@ -3975,8 +3967,11 @@ fuse_destroy(struct fuse *f)
for(node = f->id_table.array[i]; node != NULL; node = node->id_next) for(node = f->id_table.array[i]; node != NULL; node = node->id_next)
{ {
if(node->is_hidden)
if(!node->hidden_fh)
continue;
f->fs->op.free_hide(node->hidden_fh); f->fs->op.free_hide(node->hidden_fh);
node->hidden_fh = 0;
} }
} }
} }

Loading…
Cancel
Save