Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE
snapper.9590
bsc1049574.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File bsc1049574.diff of Package snapper.9590
--- snapper/Btrfs.cc.orig 2017-05-10 12:15:56.000000000 +0200 +++ snapper/Btrfs.cc 2018-12-17 20:14:44.358193085 +0100 @@ -1229,9 +1229,43 @@ }; + struct FdCloser + { + FdCloser(int fd) + : fd(fd) + { + } + + ~FdCloser() + { + if (fd > -1 ) + ::close(fd); + } + + void reset() + { + fd = -1; + } + + int close() + { + int r = ::close(fd); + fd = -1; + return r; + } + + private: + + int fd; + + }; + + bool StreamProcessor::dumper(int fd) { + FdCloser fd_closer(fd); + while (true) { boost::this_thread::interruption_point(); @@ -1247,7 +1281,7 @@ if (r < 0) { - y2err("btrfs_read_and_process_send_stream failed"); + y2err("btrfs_read_and_process_send_stream failed " << r); #if BOOST_VERSION < 104100 dumper_ret = false; @@ -1280,6 +1314,10 @@ SN_THROW(BtrfsSendReceiveException()); } + // Use RAII to help close fds. + FdCloser fd0_closer(pipefd[0]); + FdCloser fd1_closer(pipefd[1]); + struct btrfs_ioctl_send_args io_send; memset(&io_send, 0, sizeof(io_send)); io_send.send_fd = pipefd[1]; @@ -1295,18 +1333,18 @@ boost::thread task(boost::move(pt)); + fd0_closer.reset(); + int r2 = ioctl(dir2.fd(), BTRFS_IOC_SEND, &io_send); if (r2 < 0) { y2err("send ioctl failed errno:" << errno << " (" << stringerror(errno) << ")"); } - close(pipefd[1]); + fd1_closer.close(); uf.wait(); - close(pipefd[0]); - if (r2 < 0 || !uf.get()) { SN_THROW(BtrfsSendReceiveException()); @@ -1316,18 +1354,18 @@ boost::thread dumper_thread(boost::bind(&StreamProcessor::dumper, this, pipefd[0])); + fd0_closer.reset(); + int r2 = ioctl(dir2.fd(), BTRFS_IOC_SEND, &io_send); if (r2 < 0) { y2err("send ioctl failed errno:" << errno << " (" << stringerror(errno) << ")"); } - close(pipefd[1]); + fd1_closer.close(); dumper_thread.join(); - close(pipefd[0]); - if (r2 < 0 || !dumper_ret) { SN_THROW(BtrfsSendReceiveException());
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor