From: Ronnie Sahlberg Date: Mon, 11 Aug 2014 13:15:16 +0000 (-0700) Subject: Merge pull request #97 from rosslagerwall/read-close-crash X-Git-Tag: upstream/1.9.6^2~9 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;ds=sidebyside;h=a8c840e834942b6eb79d06c0bde77aedfda1836a;hp=-c;p=deb_libnfs.git Merge pull request #97 from rosslagerwall/read-close-crash libnfs: Don't perform operations on nfsfh after user callback --- a8c840e834942b6eb79d06c0bde77aedfda1836a diff --combined lib/libnfs.c index 222721c,06697e1..c213cad --- a/lib/libnfs.c +++ b/lib/libnfs.c @@@ -73,7 -73,6 +73,7 @@@ #include #include #include +#include #include #include #include @@@ -1808,6 -1807,8 +1808,8 @@@ static void nfs_pread_mcb(struct rpc_co struct nfs_cb_data *data = mdata->data; struct nfs_context *nfs = data->nfs; READ3res *res; + int cb_err; + void *cb_data; assert(rpc->magic == RPC_CONTEXT_MAGIC); @@@ -1906,9 -1907,11 +1908,11 @@@ if (data->max_offset > data->org_offset + data->org_count) { data->max_offset = data->org_offset + data->org_count; } - data->cb(data->max_offset - data->org_offset, nfs, data->buffer + (data->org_offset - data->offset), data->private_data); + cb_err = data->max_offset - data->org_offset; + cb_data = data->buffer + (data->org_offset - data->offset); } else { - data->cb(res->READ3res_u.resok.count, nfs, res->READ3res_u.resok.data.data_val, data->private_data); + cb_err = res->READ3res_u.resok.count; + cb_data = res->READ3res_u.resok.data.data_val; } data->nfsfh->ra.fh_offset = data->max_offset; @@@ -1920,6 -1923,8 +1924,8 @@@ data->nfsfh->ra.buf_ts = time(NULL); data->buffer = NULL; } + + data->cb(cb_err, nfs, cb_data, data->private_data); free_nfs_cb_data(data); } @@@ -2772,7 -2777,7 +2778,7 @@@ static void nfs_create_trunc_cb(struct { struct nfs_cb_data *data = private_data; struct nfs_context *nfs = data->nfs; - struct nfsfh *nfsfh; + struct nfsfh *nfsfh = data->nfsfh; SETATTR3res *res; assert(rpc->magic == RPC_CONTEXT_MAGIC); @@@ -2799,7 -2804,7 +2805,7 @@@ return; } - data->cb(0, nfs, data->nfsfh, data->private_data); + data->cb(0, nfs, nfsfh, data->private_data); free_nfs_cb_data(data); } @@@ -3989,12 -3994,12 +3995,12 @@@ int nfs_chmod_async_internal(struct nfs int nfs_chmod_async(struct nfs_context *nfs, const char *path, int mode, nfs_cb cb, void *private_data) { - return nfs_chown_async_internal(nfs, path, 0, mode, cb, private_data); + return nfs_chmod_async_internal(nfs, path, 0, mode, cb, private_data); } int nfs_lchmod_async(struct nfs_context *nfs, const char *path, int mode, nfs_cb cb, void *private_data) { - return nfs_chown_async_internal(nfs, path, 1, mode, cb, private_data); + return nfs_chmod_async_internal(nfs, path, 1, mode, cb, private_data); } /*