Package: ftp-ssl
Version: 0.17.34+0.2-5.1
Severity: normal
Tags: patch
X-Debbugs-Cc: [email protected]
Dear Maintainer,
* What led up to the situation?
Trying to upload to vsftpd server (3.0.3-12) with ftp-ssl using TLS.
* What exactly did you do (or not do) that was effective (or
ineffective)?
Uploading via plaintext FTP works normally. Tryed changing vsftpd options - did
not help.
Fixing the ftp-ssl code helped.
* What was the outcome of this action?
File uploads, but returns error "426 Failure reading network stream."
* What outcome did you expect instead?
File uploads cleanly, without errors.
here is example transaction:
tekko% date > test.txt
tekko% ls -l test.txt
-rw-r--r-- 1 test test 30 Jul 21 02:34 test.txt
tekko% ftp-ssl -z secure ftp.example.org
Connected to ftp.example.org.
220 Welcome to VSFTPD
Name (ftp.example.org:test): test
234 Proceed with negotiation.
[SSL Cipher TLS_AES_256_GCM_SHA384]
200 PBSZ set to 0.
200 PROT now Private.
[Encrypted data transfer.]
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> put test.txt
local: test.txt remote: test.txt
227 Entering Passive Mode (195,190,136,132,242,251).
150 Ok to send data.
426 Failure reading network stream.
30 bytes sent in 0.00 secs (770.9705 kB/s)
ftp> dir test.txt
227 Entering Passive Mode (195,190,136,132,240,196).
150 Here comes the directory listing.
-rw-r--r-- 1 ftp ftp 30 Jul 21 02:35 test.txt
226 Directory send OK.
ftp>
I've looked up the ftp-ssl source, as well the official docs and did some
debugging.
Problem seems to be that ftp-ssl is closing file descriptor before doing
SSL_shutdown(),
thus losing unsent SSL data, which vsftpd then complains about.
So when SSL_shutdown() does run in ftp-ssl code, it then returns -1 as socket
is already gone. According to the docs at
https://linux.die.net/man/3/ssl_shutdown,
client should first call SSL_shutdown() (if needed twice), and only then should
the
socket be closed. Attached patch does so as documentation directs, and thus
fixes
the problem for me - uploads now finish with regular "226 Transfer complete."
-- System Information:
Debian Release: 11.0
APT prefers testing-security
APT policy: (500, 'testing-security'), (500, 'testing')
Architecture: amd64 (x86_64)
Kernel: Linux 5.10.0-7-amd64 (SMP w/1 CPU thread)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8),
LANGUAGE=en_US:en
Shell: /bin/sh linked to /bin/dash
Init: sysvinit (via /sbin/init)
Versions of packages ftp-ssl depends on:
ii libc6 2.31-12
ii libedit2 3.1-20191231-2+b1
ii libssl1.1 1.1.1k-1
ii netbase 6.3
ftp-ssl recommends no packages.
ftp-ssl suggests no packages.
-- no debconf information
--- netkit-ftp-ssl-0.17.34+0.2/ftp/ftp.c.orig 2021-07-21 02:59:00.000000000
+0200
+++ netkit-ftp-ssl-0.17.34+0.2/ftp/ftp.c 2021-07-21 02:59:30.632103435
+0200
@@ -947,18 +947,20 @@
INTON;
}
INTOFF;
- (void) fclose(dout);
- dout = NULL;
#ifdef USE_SSL
if (ssl_data_active_flag && (ssl_data_con!=NULL)) {
- SSL_shutdown(ssl_data_con);
+ fflush(dout);
+ if (SSL_shutdown(ssl_data_con) == 0) SSL_shutdown(ssl_data_con);
SSL_free(ssl_data_con);
ssl_data_active_flag=0;
ssl_data_con=NULL;
}
#endif /* USE_SSL */
+ (void) fclose(dout);
+ dout = NULL;
+
/* closes data as well, so discard it */
data = -1;
INTON;