tbaeder / rpms / vsftpd

Forked from rpms/vsftpd 3 years ago
Clone
e000aa4
From 6224ecc5ac209323baa775880c0602c3fde3590a Mon Sep 17 00:00:00 2001
8d113be
From: Martin Sehnoutka <msehnout@redhat.com>
e000aa4
Date: Thu, 17 Nov 2016 13:10:41 +0100
Ondřej Lysoněk 7c0626d
Subject: [PATCH 27/59] Delete files when upload fails.
8d113be
e000aa4
Previously the uploaded file wasn't removed when the network was
e000aa4
disconnected. Now it is successfully deleted.
8d113be
---
8d113be
 ftpcodes.h  |  3 ++-
8d113be
 ftpdataio.c |  8 ++++++++
8d113be
 main.c      |  2 +-
8d113be
 postlogin.c |  9 ++++++++-
8d113be
 session.h   |  1 +
8d113be
 sysutil.c   | 10 ++++++++++
8d113be
 sysutil.h   |  1 +
8d113be
 7 files changed, 31 insertions(+), 3 deletions(-)
8d113be
8d113be
diff --git a/ftpcodes.h b/ftpcodes.h
e000aa4
index 81e25c5..54dfae7 100644
8d113be
--- a/ftpcodes.h
8d113be
+++ b/ftpcodes.h
8d113be
@@ -15,7 +15,8 @@
8d113be
 #define FTP_PBSZOK            200
8d113be
 #define FTP_PROTOK            200
8d113be
 #define FTP_OPTSOK            200
8d113be
-#define FTP_ALLOOK            202
8d113be
+#define FTP_ALLOOK            200
8d113be
+#define FTP_ALLOIGN           202
8d113be
 #define FTP_FEAT              211
8d113be
 #define FTP_STATOK            211
8d113be
 #define FTP_SIZEOK            213
8d113be
diff --git a/ftpdataio.c b/ftpdataio.c
8d113be
index 00f9021..c859d80 100644
8d113be
--- a/ftpdataio.c
8d113be
+++ b/ftpdataio.c
8d113be
@@ -242,6 +242,10 @@ init_data_sock_params(struct vsf_session* p_sess, int sock_fd)
8d113be
   /* Start the timeout monitor */
8d113be
   vsf_sysutil_install_io_handler(handle_io, p_sess);
8d113be
   start_data_alarm(p_sess);
8d113be
+  if(tunable_delete_failed_uploads)
8d113be
+  {
8d113be
+    vsf_sysutil_rcvtimeo(sock_fd);
8d113be
+  }
8d113be
 }
8d113be
 
8d113be
 static void
8d113be
@@ -615,6 +619,10 @@ do_file_recv(struct vsf_session* p_sess, int file_fd, int is_ascii)
8d113be
     else if (retval == 0 && !prev_cr)
8d113be
     {
8d113be
       /* Transfer done, nifty */
8d113be
+      if (tunable_delete_failed_uploads &&
8d113be
+          !is_ascii && p_sess->upload_size > 0 &&
8d113be
+          p_sess->upload_size != ret_struct.transferred)
8d113be
+        ret_struct.retval = -2;
8d113be
       return ret_struct;
8d113be
     }
8d113be
     num_to_write = (unsigned int) retval;
8d113be
diff --git a/main.c b/main.c
8d113be
index f1e2f69..f039081 100644
8d113be
--- a/main.c
8d113be
+++ b/main.c
8d113be
@@ -44,7 +44,7 @@ main(int argc, const char* argv[])
8d113be
     /* Login */
8d113be
     1, 0, INIT_MYSTR, INIT_MYSTR,
8d113be
     /* Protocol state */
8d113be
-    0, 1, INIT_MYSTR, 0, 0,
8d113be
+    0, 0, 1, INIT_MYSTR, 0, 0,
8d113be
     /* HTTP hacks */
8d113be
     0, INIT_MYSTR,
8d113be
     /* Session state */
8d113be
diff --git a/postlogin.c b/postlogin.c
e000aa4
index 29958c0..e473c34 100644
8d113be
--- a/postlogin.c
8d113be
+++ b/postlogin.c
e000aa4
@@ -356,7 +356,14 @@ process_post_login(struct vsf_session* p_sess)
8d113be
     }
8d113be
     else if (str_equal_text(&p_sess->ftp_cmd_str, "ALLO"))
8d113be
     {
8d113be
-      vsf_cmdio_write(p_sess, FTP_ALLOOK, "ALLO command ignored.");
8d113be
+      if (tunable_delete_failed_uploads && !p_sess->is_ascii)
8d113be
+      {
8d113be
+        p_sess->upload_size = (filesize_t)vsf_sysutil_atoi(str_getbuf(&p_sess->ftp_cmd_str)+5);
8d113be
+        vsf_cmdio_write(p_sess, FTP_ALLOOK, "The filesize has been allocated.");
8d113be
+      }
8d113be
+      else {
8d113be
+        vsf_cmdio_write(p_sess, FTP_ALLOIGN, "ALLO command ignored.");
8d113be
+      }
8d113be
     }
8d113be
     else if (str_equal_text(&p_sess->ftp_cmd_str, "REIN"))
8d113be
     {
8d113be
diff --git a/session.h b/session.h
8d113be
index 3e8fdd5..4eccf46 100644
8d113be
--- a/session.h
8d113be
+++ b/session.h
8d113be
@@ -41,6 +41,7 @@ struct vsf_session
8d113be
   struct mystr anon_pass_str;
8d113be
 
8d113be
   /* Details of the FTP protocol state */
8d113be
+  filesize_t upload_size;
8d113be
   filesize_t restart_pos;
8d113be
   int is_ascii;
8d113be
   struct mystr rnfr_filename_str;
8d113be
diff --git a/sysutil.c b/sysutil.c
e000aa4
index 099748f..42bcdf8 100644
8d113be
--- a/sysutil.c
8d113be
+++ b/sysutil.c
Ondřej Lysoněk 7c0626d
@@ -680,6 +680,16 @@ vsf_sysutil_activate_keepalive(int fd)
Ondřej Lysoněk 7c0626d
   }
8d113be
 }
8d113be
 
Ondřej Lysoněk 7c0626d
+void
8d113be
+vsf_sysutil_rcvtimeo(int fd)
8d113be
+{
8d113be
+  struct timeval tv;
8d113be
+
8d113be
+  tv.tv_sec = tunable_data_connection_timeout;
8d113be
+  tv.tv_usec = 0;
8d113be
+  setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval));
8d113be
+}
8d113be
+
Ondřej Lysoněk 7c0626d
 void
8d113be
 vsf_sysutil_activate_reuseaddr(int fd)
8d113be
 {
8d113be
diff --git a/sysutil.h b/sysutil.h
e000aa4
index 13153cd..2886bbc 100644
8d113be
--- a/sysutil.h
8d113be
+++ b/sysutil.h
e000aa4
@@ -266,6 +266,7 @@ void vsf_sysutil_dns_resolve(struct vsf_sysutil_sockaddr** p_sockptr,
8d113be
                              const char* p_name);
8d113be
 /* Option setting on sockets */
8d113be
 void vsf_sysutil_activate_keepalive(int fd);
8d113be
+void vsf_sysutil_rcvtimeo(int fd);
8d113be
 void vsf_sysutil_set_iptos_throughput(int fd);
8d113be
 void vsf_sysutil_activate_reuseaddr(int fd);
8d113be
 void vsf_sysutil_set_nodelay(int fd);
8d113be
-- 
Ondřej Lysoněk 7c0626d
2.14.4
8d113be