summaryrefslogtreecommitdiff
path: root/src/client/fuse_ll.cc
diff options
context:
space:
mode:
authorAndrey Kuznetsov <Andrey_Kuznetsov@epam.com>2013-07-10 14:27:28 -0700
committerSage Weil <sage@inktank.com>2013-09-04 17:55:02 -0700
commit6d20d5ef04b8633774ab587f77b67c07acd2a7af (patch)
treeba6e256bfd9774e7caf82f96b75535fa0694eb65 /src/client/fuse_ll.cc
parent82cdb75f541eace3d3719da7ada723c4e47ed10b (diff)
downloadceph-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.cc12
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
}