From 1a8b52c3caaa3c2665f19c96b03e82de6fe10b16 Mon Sep 17 00:00:00 2001 From: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> Date: Thu, 1 Feb 2018 13:20:26 -0500 Subject: [PATCH] ftp: fix write when out file is closed and emit condition. * protect against write() call on a closed incoming stream. * Use DataTransferEventCode::closed_by_peer when data are not completly received, else ataTransferEventCode::finished is emitted. Change-Id: I15f2518f70afbe1bfe8aa8813cbca676dec4360a Reviewed-by: Olivier Soldano <olivier.soldano@savoirfairelinux.com> --- src/data_transfer.cpp | 8 ++++++-- src/ftp_server.cpp | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/data_transfer.cpp b/src/data_transfer.cpp index b2fa6f587e..f695511996 100644 --- a/src/data_transfer.cpp +++ b/src/data_transfer.cpp @@ -287,9 +287,13 @@ IncomingFileTransfer::close() noexcept } catch (...) {} fout_.close(); - RING_DBG() << "[FTP] file closed with size " << info_.bytesProgress; - emit(DRing::DataTransferEventCode::finished); + RING_DBG() << "[FTP] file closed, rx " << info_.bytesProgress + << " on " << info_.totalSize; + if (std::size_t(info_.bytesProgress) == info_.totalSize) + emit(DRing::DataTransferEventCode::finished); + else + emit(DRing::DataTransferEventCode::closed_by_host); } void diff --git a/src/ftp_server.cpp b/src/ftp_server.cpp index 6388e3164f..501170477a 100644 --- a/src/ftp_server.cpp +++ b/src/ftp_server.cpp @@ -93,7 +93,8 @@ FtpServer::write(const std::vector<uint8_t>& buffer) auto count = headerStream_.gcount(); if (!count) continue; - out_->write(reinterpret_cast<const uint8_t*>(&line_[0]), count); + if (out_) + out_->write(reinterpret_cast<const uint8_t*>(&line_[0]), count); rx_ += count; if (rx_ >= fileSize_) { closeCurrentFile(); @@ -107,7 +108,8 @@ FtpServer::write(const std::vector<uint8_t>& buffer) break; case FtpState::READ_DATA: - out_->write(&buffer[0], buffer.size()); + if (out_) + out_->write(&buffer[0], buffer.size()); rx_ += buffer.size(); if (rx_ >= fileSize_) { closeCurrentFile(); -- GitLab