summaryrefslogtreecommitdiff
path: root/src/client/Client.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/Client.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/Client.cc')
-rw-r--r--src/client/Client.cc24
1 files changed, 11 insertions, 13 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc
index 8b9185165f1..c40c75560aa 100644
--- a/src/client/Client.cc
+++ b/src/client/Client.cc
@@ -4349,13 +4349,18 @@ int Client::readlink(const char *relpath, char *buf, loff_t size)
int r = path_walk(path, &in, false);
if (r < 0)
return r;
-
+
+ return _readlink(in, buf, size);
+}
+
+int Client::_readlink(Inode *in, char *buf, size_t size)
+{
if (!in->is_symlink())
return -EINVAL;
// copy into buf (at most size bytes)
- r = in->symlink.length();
- if (r > size)
+ int r = in->symlink.length();
+ if (r > (int)size)
r = size;
memcpy(buf, in->symlink.c_str(), r);
return r;
@@ -7016,7 +7021,7 @@ int Client::ll_removexattr(Inode *in, const char *name, int uid, int gid)
}
-int Client::ll_readlink(Inode *in, const char **value, int uid, int gid)
+int Client::ll_readlink(Inode *in, char *buf, size_t buflen, int uid, int gid)
{
Mutex::Locker lock(client_lock);
@@ -7032,15 +7037,8 @@ int Client::ll_readlink(Inode *in, const char **value, int uid, int gid)
++dn;
}
- int r = 0;
- if (in->is_symlink()) {
- *value = in->symlink.c_str();
- } else {
- *value = "";
- r = -EINVAL;
- }
- ldout(cct, 3) << "ll_readlink " << vino << " = " << r << " (" << *value
- << ")" << dendl;
+ int r = _readlink(in, buf, buflen);
+ ldout(cct, 3) << "ll_readlink " << vino << " = " << r << dendl;
return r;
}