Skip to content

Commit

Permalink
fix segfault
Browse files Browse the repository at this point in the history
  • Loading branch information
szmi committed Sep 29, 2006
1 parent b917f9a commit 09d5ee2
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
6 changes: 6 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2006-09-29 Miklos Szeredi <miklos@szeredi.hu>

* Fix segfault if there are outstanding writes to the server after
release on the file descriptor. The only happened on FreeBSD.
Reported by Andriy Gapon

2006-08-18 Miklos Szeredi <miklos@szeredi.hu>

* Released 1.7
Expand Down
20 changes: 18 additions & 2 deletions sshfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ struct sshfs_file {
int is_seq;
int connver;
int modifver;
int refs;
};

struct sshfs {
Expand Down Expand Up @@ -1768,6 +1769,7 @@ static int sshfs_open_common(const char *path, mode_t mode,
pthread_cond_init(&sf->write_finished, NULL);
/* Assume random read after open */
sf->is_seq = 0;
sf->refs = 1;
sf->next_pos = 0;
sf->modifver= sshfs.modifver;
sf->connver = sshfs.connver;
Expand Down Expand Up @@ -1851,6 +1853,19 @@ static int sshfs_fsync(const char *path, int isdatasync,
return sshfs_flush(path, fi);
}

static void sshfs_file_put(struct sshfs_file *sf)
{
sf->refs--;
if (!sf->refs)
g_free(sf);
}

static struct sshfs_file *sshfs_file_get(struct sshfs_file *sf)
{
sf->refs++;
return sf;
}

static int sshfs_release(const char *path, struct fuse_file_info *fi)
{
struct sshfs_file *sf = get_sshfs_file(fi);
Expand All @@ -1861,7 +1876,7 @@ static int sshfs_release(const char *path, struct fuse_file_info *fi)
}
buf_free(handle);
chunk_put_locked(sf->readahead);
g_free(sf);
sshfs_file_put(sf);
return 0;
}

Expand Down Expand Up @@ -2084,6 +2099,7 @@ static void sshfs_write_end(struct request *req)
}
list_del(&req->list);
pthread_cond_broadcast(&sf->write_finished);
sshfs_file_put(sf);
}

static int sshfs_write(const char *path, const char *wbuf, size_t size,
Expand All @@ -2110,7 +2126,7 @@ static int sshfs_write(const char *path, const char *wbuf, size_t size,
iov[1].iov_len = size;
if (!sshfs.sync_write && !sf->write_error)
err = sftp_request_send(SSH_FXP_WRITE, iov, 2, sshfs_write_begin,
sshfs_write_end, 0, sf, NULL);
sshfs_write_end, 0, sshfs_file_get(sf), NULL);
else
err = sftp_request_iov(SSH_FXP_WRITE, iov, 2, SSH_FXP_STATUS, NULL);
buf_free(&buf);
Expand Down

0 comments on commit 09d5ee2

Please sign in to comment.