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/Client.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/Client.cc')
-rw-r--r-- | src/client/Client.cc | 24 |
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; } |