summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-05-09 08:49:51 -0700
committerSage Weil <sage@inktank.com>2013-05-09 10:48:59 -0700
commit110a823fd43a60d829641ea03796331a37099244 (patch)
tree1477daece26ff1540d33a7e943cced14cf73b5ad
parent3dc7c3295b21e58cc7235ea52a3b1d9690879737 (diff)
downloadceph-110a823fd43a60d829641ea03796331a37099244.tar.gz
rados: fix fd leak
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/rados.cc11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/rados.cc b/src/rados.cc
index 1f0cc2a662e..69a97a91748 100644
--- a/src/rados.cc
+++ b/src/rados.cc
@@ -192,25 +192,28 @@ static int do_get(IoCtx& io_ctx, const char *objname, const char *outfile, unsig
}
uint64_t offset = 0;
+ int ret;
while (true) {
bufferlist outdata;
- int ret = io_ctx.read(oid, outdata, op_size, offset);
+ ret = io_ctx.read(oid, outdata, op_size, offset);
if (ret <= 0) {
- return ret;
+ goto out;
}
ret = outdata.write_fd(fd);
if (ret < 0) {
cerr << "error writing to file: " << cpp_strerror(ret) << std::endl;
- return ret;
+ goto out;
}
if (outdata.length() < op_size)
break;
offset += outdata.length();
}
+ ret = 0;
+ out:
if (fd != 1)
TEMP_FAILURE_RETRY(::close(fd));
- return 0;
+ return ret;
}
static int do_copy(IoCtx& io_ctx, const char *objname, IoCtx& target_ctx, const char *target_obj)