diff options
author | Andrey Kuznetsov <Andrey_Kuznetsov@epam.com> | 2013-07-10 14:27:28 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-09-04 17:55:02 -0700 |
commit | 6d20d5ef04b8633774ab587f77b67c07acd2a7af (patch) | |
tree | ba6e256bfd9774e7caf82f96b75535fa0694eb65 /src/client/fuse_ll.cc | |
parent | 82cdb75f541eace3d3719da7ada723c4e47ed10b (diff) | |
download | ceph-wip-libcephfs.tar.gz |
client, libcephfs: make readlink sanewip-libcephfs
Supply a buffer and copy the data into it. Do not ever expose internal
pointers from libcephfs's own cache.
Signed-off-by: Sage Weil <sage@inktank.com>
Diffstat (limited to 'src/client/fuse_ll.cc')
-rw-r--r-- | src/client/fuse_ll.cc | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index 97a11f187fe..57aca0585b1 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -258,13 +258,15 @@ static void fuse_ll_readlink(fuse_req_t req, fuse_ino_t ino) CephFuse::Handle *cfuse = (CephFuse::Handle *)fuse_req_userdata(req); const struct fuse_ctx *ctx = fuse_req_ctx(req); Inode *in = cfuse->iget(ino); - const char *value; + char buf[PATH_MAX + 1]; // leave room for a null terminator - int r = cfuse->client->ll_readlink(in, &value, ctx->uid, ctx->gid); - if (r == 0) - fuse_reply_readlink(req, value); - else + int r = cfuse->client->ll_readlink(in, buf, sizeof(buf) - 1, ctx->uid, ctx->gid); + if (r >= 0) { + buf[r] = '\0'; + fuse_reply_readlink(req, buf); + } else { fuse_reply_err(req, -r); + } cfuse->iput(in); // iput required } |