]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
SyntheticClient: fix chunk_file()
authorxie xingguo <xie.xingguo@zte.com.cn>
Tue, 21 Jun 2016 02:40:30 +0000 (10:40 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Tue, 21 Jun 2016 02:40:30 +0000 (10:40 +0800)
Add sanity check, fix potential fd leak etc.

Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/client/SyntheticClient.cc

index b2ef93ae30ba5c151eb12c4cf7d970987d3383fe..2a0e0df31469e36ec3b26431f70ed5b0ec91e68f 100644 (file)
@@ -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;