8d113be502
- Readd seccomp disabled by default - vsftpd local_max_rate option doesn't work as expected - The vsftpd hangs in a SIGCHLD handler when the pam_exec.so is used in pam.d - configuration - The vsftpd doesn't remove failed upload when the delete_failed_uploads is - enabled and the network cable is unplagged - man pages bug - vsftpd segfaults in vsf_sysutil_strndup - Fix logging when syslog is used
137 lines
3.9 KiB
Diff
137 lines
3.9 KiB
Diff
From 9be8a4188420bba2075eacf9aea8fa26b6ebdcc5 Mon Sep 17 00:00:00 2001
|
|
From: Martin Sehnoutka <msehnout@redhat.com>
|
|
Date: Fri, 8 Apr 2016 15:03:16 +0200
|
|
Subject: [PATCH 4/7] vsftpd-3.0.2-del-upl
|
|
|
|
---
|
|
ftpcodes.h | 3 ++-
|
|
ftpdataio.c | 8 ++++++++
|
|
main.c | 2 +-
|
|
postlogin.c | 9 ++++++++-
|
|
session.h | 1 +
|
|
sysutil.c | 10 ++++++++++
|
|
sysutil.h | 1 +
|
|
7 files changed, 31 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/ftpcodes.h b/ftpcodes.h
|
|
index 3950f92..97801f3 100644
|
|
--- a/ftpcodes.h
|
|
+++ b/ftpcodes.h
|
|
@@ -15,7 +15,8 @@
|
|
#define FTP_PBSZOK 200
|
|
#define FTP_PROTOK 200
|
|
#define FTP_OPTSOK 200
|
|
-#define FTP_ALLOOK 202
|
|
+#define FTP_ALLOOK 200
|
|
+#define FTP_ALLOIGN 202
|
|
#define FTP_FEAT 211
|
|
#define FTP_STATOK 211
|
|
#define FTP_SIZEOK 213
|
|
diff --git a/ftpdataio.c b/ftpdataio.c
|
|
index 00f9021..c859d80 100644
|
|
--- a/ftpdataio.c
|
|
+++ b/ftpdataio.c
|
|
@@ -242,6 +242,10 @@ init_data_sock_params(struct vsf_session* p_sess, int sock_fd)
|
|
/* Start the timeout monitor */
|
|
vsf_sysutil_install_io_handler(handle_io, p_sess);
|
|
start_data_alarm(p_sess);
|
|
+ if(tunable_delete_failed_uploads)
|
|
+ {
|
|
+ vsf_sysutil_rcvtimeo(sock_fd);
|
|
+ }
|
|
}
|
|
|
|
static void
|
|
@@ -615,6 +619,10 @@ do_file_recv(struct vsf_session* p_sess, int file_fd, int is_ascii)
|
|
else if (retval == 0 && !prev_cr)
|
|
{
|
|
/* Transfer done, nifty */
|
|
+ if (tunable_delete_failed_uploads &&
|
|
+ !is_ascii && p_sess->upload_size > 0 &&
|
|
+ p_sess->upload_size != ret_struct.transferred)
|
|
+ ret_struct.retval = -2;
|
|
return ret_struct;
|
|
}
|
|
num_to_write = (unsigned int) retval;
|
|
diff --git a/main.c b/main.c
|
|
index f1e2f69..f039081 100644
|
|
--- a/main.c
|
|
+++ b/main.c
|
|
@@ -44,7 +44,7 @@ main(int argc, const char* argv[])
|
|
/* Login */
|
|
1, 0, INIT_MYSTR, INIT_MYSTR,
|
|
/* Protocol state */
|
|
- 0, 1, INIT_MYSTR, 0, 0,
|
|
+ 0, 0, 1, INIT_MYSTR, 0, 0,
|
|
/* HTTP hacks */
|
|
0, INIT_MYSTR,
|
|
/* Session state */
|
|
diff --git a/postlogin.c b/postlogin.c
|
|
index 154c16a..8363c9c 100644
|
|
--- a/postlogin.c
|
|
+++ b/postlogin.c
|
|
@@ -358,7 +358,14 @@ process_post_login(struct vsf_session* p_sess)
|
|
}
|
|
else if (str_equal_text(&p_sess->ftp_cmd_str, "ALLO"))
|
|
{
|
|
- vsf_cmdio_write(p_sess, FTP_ALLOOK, "ALLO command ignored.");
|
|
+ if (tunable_delete_failed_uploads && !p_sess->is_ascii)
|
|
+ {
|
|
+ p_sess->upload_size = (filesize_t)vsf_sysutil_atoi(str_getbuf(&p_sess->ftp_cmd_str)+5);
|
|
+ vsf_cmdio_write(p_sess, FTP_ALLOOK, "The filesize has been allocated.");
|
|
+ }
|
|
+ else {
|
|
+ vsf_cmdio_write(p_sess, FTP_ALLOIGN, "ALLO command ignored.");
|
|
+ }
|
|
}
|
|
else if (str_equal_text(&p_sess->ftp_cmd_str, "REIN"))
|
|
{
|
|
diff --git a/session.h b/session.h
|
|
index 3e8fdd5..4eccf46 100644
|
|
--- a/session.h
|
|
+++ b/session.h
|
|
@@ -41,6 +41,7 @@ struct vsf_session
|
|
struct mystr anon_pass_str;
|
|
|
|
/* Details of the FTP protocol state */
|
|
+ filesize_t upload_size;
|
|
filesize_t restart_pos;
|
|
int is_ascii;
|
|
struct mystr rnfr_filename_str;
|
|
diff --git a/sysutil.c b/sysutil.c
|
|
index 61d9f28..3c4a337 100644
|
|
--- a/sysutil.c
|
|
+++ b/sysutil.c
|
|
@@ -681,6 +681,16 @@ vsf_sysutil_activate_keepalive(int fd)
|
|
}
|
|
|
|
void
|
|
+vsf_sysutil_rcvtimeo(int fd)
|
|
+{
|
|
+ struct timeval tv;
|
|
+
|
|
+ tv.tv_sec = tunable_data_connection_timeout;
|
|
+ tv.tv_usec = 0;
|
|
+ setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval));
|
|
+}
|
|
+
|
|
+void
|
|
vsf_sysutil_activate_reuseaddr(int fd)
|
|
{
|
|
int reuseaddr = 1;
|
|
diff --git a/sysutil.h b/sysutil.h
|
|
index d341b5d..be727f5 100644
|
|
--- a/sysutil.h
|
|
+++ b/sysutil.h
|
|
@@ -267,6 +267,7 @@ void vsf_sysutil_dns_resolve(struct vsf_sysutil_sockaddr** p_sockptr,
|
|
const char* p_name);
|
|
/* Option setting on sockets */
|
|
void vsf_sysutil_activate_keepalive(int fd);
|
|
+void vsf_sysutil_rcvtimeo(int fd);
|
|
void vsf_sysutil_set_iptos_throughput(int fd);
|
|
void vsf_sysutil_activate_reuseaddr(int fd);
|
|
void vsf_sysutil_set_nodelay(int fd);
|
|
--
|
|
2.5.5
|
|
|