summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Trofimovich <slyfox@gentoo.org>2019-10-01 23:15:22 +0100
committerSergei Trofimovich <slyfox@gentoo.org>2019-10-01 23:16:13 +0100
commitb47b227ea3da7aec35ee5db26ccac8b5be543bda (patch)
tree3055b76e19428c19829a6ba81bd9d7bfa27be881 /net-ftp/proftpd/files
parentnet-misc/dropbox: add new dropbox@ service (diff)
downloadgentoo-b47b227ea3da7aec35ee5db26ccac8b5be543bda.tar.gz
gentoo-b47b227ea3da7aec35ee5db26ccac8b5be543bda.tar.bz2
gentoo-b47b227ea3da7aec35ee5db26ccac8b5be543bda.zip
net-ftp/proftpd: backport EINTR/EAGAIN fix, bug #695972
Reported-by: Dennis Lichtenthäler Closes: https://bugs.gentoo.org/695972 Package-Manager: Portage-2.3.76, Repoman-2.3.17 Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Diffstat (limited to 'net-ftp/proftpd/files')
-rw-r--r--net-ftp/proftpd/files/proftpd-1.3.6-EINTR-like-EAGAIN.patch54
1 files changed, 54 insertions, 0 deletions
diff --git a/net-ftp/proftpd/files/proftpd-1.3.6-EINTR-like-EAGAIN.patch b/net-ftp/proftpd/files/proftpd-1.3.6-EINTR-like-EAGAIN.patch
new file mode 100644
index 000000000000..43608d96492c
--- /dev/null
+++ b/net-ftp/proftpd/files/proftpd-1.3.6-EINTR-like-EAGAIN.patch
@@ -0,0 +1,54 @@
+https://bugs.gentoo.org/695972
+https://github.com/proftpd/proftpd/commit/f09f0c661621eb22cb1ce579194478007ba62866
+
+From f09f0c661621eb22cb1ce579194478007ba62866 Mon Sep 17 00:00:00 2001
+From: Justin Maggard <jmaggard@netgear.com>
+Date: Tue, 10 Oct 2017 18:20:06 -0700
+Subject: [PATCH] Bug #4319: Treat EINTR like EAGAIN
+
+This bug described a situation where an ongoing transfer would be
+prematurely aborted when one of our timers fired. The timer could have
+fired for an unrelated reason, but if we were in the process of reading
+or writing with pr_netio_read() or pr_netio_write(), those calls would
+be interrupted with errno set to EINTR, and an error would be returned.
+Then pr_data_xfer() would abort the transfer.
+
+EAGAIN was already being handled properly, and we can just use the same
+treatment for EINTR so that we only respond to the timers we should
+actually care about.
+---
+ src/data.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/src/data.c
++++ b/src/data.c
+@@ -1143,7 +1143,7 @@ int pr_data_xfer(char *cl_buf, size_t cl_size) {
+ while (len < 0) {
+ int xerrno = errno;
+
+- if (xerrno == EAGAIN) {
++ if (xerrno == EAGAIN || xerrno == EINTR) {
+ /* Since our socket is in non-blocking mode, read(2) can return
+ * EAGAIN if there is no data yet for us. Handle this by
+ * delaying temporarily, then trying again.
+@@ -1265,7 +1265,7 @@ int pr_data_xfer(char *cl_buf, size_t cl_size) {
+ while (len < 0) {
+ int xerrno = errno;
+
+- if (xerrno == EAGAIN) {
++ if (xerrno == EAGAIN || xerrno == EINTR) {
+ /* Since our socket is in non-blocking mode, read(2) can return
+ * EAGAIN if there is no data yet for us. Handle this by
+ * delaying temporarily, then trying again.
+@@ -1362,7 +1362,7 @@ int pr_data_xfer(char *cl_buf, size_t cl_size) {
+ while (bwrote < 0) {
+ int xerrno = errno;
+
+- if (xerrno == EAGAIN) {
++ if (xerrno == EAGAIN || xerrno == EINTR) {
+ /* Since our socket is in non-blocking mode, write(2) can return
+ * EAGAIN if there is not enough from for our data yet. Handle
+ * this by delaying temporarily, then trying again.
+--
+2.23.0
+