Merge pull request #97 from rosslagerwall/read-close-crash
[deb_libnfs.git] / lib / libnfs.c
index 5692dc3dac174cc3ea5c84e2f42f8b268a6723c4..c213caddb20967361549c1b0eca28e6c1ae65822 100644 (file)
@@ -73,6 +73,7 @@
 #include <string.h>
 #include <assert.h>
 #include <errno.h>
+#include <time.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -1807,6 +1808,8 @@ static void nfs_pread_mcb(struct rpc_context *rpc, int status, void *command_dat
        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);
 
@@ -1905,9 +1908,11 @@ static void nfs_pread_mcb(struct rpc_context *rpc, int status, void *command_dat
                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;
@@ -1919,6 +1924,8 @@ static void nfs_pread_mcb(struct rpc_context *rpc, int status, void *command_dat
                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);
 }
 
@@ -2771,7 +2778,7 @@ static void nfs_create_trunc_cb(struct rpc_context *rpc, int status, void *comma
 {
        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);
@@ -2798,7 +2805,7 @@ static void nfs_create_trunc_cb(struct rpc_context *rpc, int status, void *comma
                return;
        }
 
-       data->cb(0, nfs, data->nfsfh, data->private_data);
+       data->cb(0, nfs, nfsfh, data->private_data);
        free_nfs_cb_data(data);
 }
 
@@ -3988,12 +3995,12 @@ int nfs_chmod_async_internal(struct nfs_context *nfs, const char *path, int no_f
 
 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);
 }
 
 /*