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