From: xie xingguo Date: Tue, 21 Jun 2016 02:40:30 +0000 (+0800) Subject: SyntheticClient: fix chunk_file() X-Git-Tag: ses5-milestone5~533^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c6d50ba7df81473340d5b069573778c04138434f;p=ceph.git SyntheticClient: fix chunk_file() Add sanity check, fix potential fd leak etc. Signed-off-by: xie xingguo --- diff --git a/src/client/SyntheticClient.cc b/src/client/SyntheticClient.cc index b2ef93ae30ba..2a0e0df31469 100644 --- a/src/client/SyntheticClient.cc +++ b/src/client/SyntheticClient.cc @@ -3324,10 +3324,15 @@ int SyntheticClient::lookup_ino(inodeno_t ino) int SyntheticClient::chunk_file(string &filename) { int fd = client->open(filename.c_str(), O_RDONLY); - int ret; + if (fd < 0) + return fd; struct stat st; - client->fstat(fd, &st); + int ret = client->fstat(fd, &st); + if (ret < 0) { + client->close(fd); + return ret; + } uint64_t size = st.st_size; dout(0) << "file " << filename << " size is " << size << dendl; @@ -3337,8 +3342,7 @@ int SyntheticClient::chunk_file(string &filename) memset(&inode, 0, sizeof(inode)); inode.ino = st.st_ino; ret = client->fdescribe_layout(fd, &inode.layout); - if (ret < 0) - return ret; + assert(ret == 0); // otherwise fstat did a bad thing uint64_t pos = 0; bufferlist from_before;