pkgsrc/net/kdenetwork2/patches/patch-ae
jlam 5eff5be626 * Strongly buildlinkify.
* Use qt2-designer-kde for a uic that understands KDE2 widgets.
* Fix problem noted by Marcello Balduccini <marcello.balduccini@ttu.edu>
  in how kpgp handles pipes with child processes -- prevents kpgp from
  remaining stuck while waiting for the child pgp process to terminate.
2001-11-13 21:25:54 +00:00

64 lines
2.6 KiB
Text

$NetBSD: patch-ae,v 1.1 2001/11/13 21:25:55 jlam Exp $
--- libkdenetwork/kpgpbase.cpp.orig Tue Sep 4 19:20:45 2001
+++ libkdenetwork/kpgpbase.cpp
@@ -265,7 +265,28 @@
//kdDebug(5100) << "Read " << len << " bytes from pout[0]" << endl;
str[len] ='\0';
output += str;
- }
+ } else {
+ /*
+ * Apparently, on NetBSD when the child dies, the pipe begins
+ * receiving empty data packets *before* waitpid() has signaled
+ * that the child has died. Also, notice that this happens
+ * without any error bit being set in pollfd.revents (is this a
+ * NetBSD bug???). Notice that these anomalous packets exist
+ * according to poll(), but have length 0 according to read().
+ * Thus, kde can remain stuck inside this loop.
+ *
+ * A solution to this problem is to get out of the inner loop
+ * when read() returns <=0. In this way, kde has another chance
+ * to call waitpid() to check if the child has died -- and this
+ * time the call should succeed.
+ *
+ * Setting POLLHUP in pollfd.revents is not necessary, but I just
+ * like the idea of signaling that something strange has
+ * happened.
+ */
+ pollout.revents |= POLLHUP;
+ break;
+ }
}
}
else if (pollstatus == -1) {
@@ -288,7 +309,28 @@
//kdDebug(5100) << "Read " << len << " bytes from perr[0]" << endl;
str[len] ='\0';
info += str;
- }
+ } else {
+ /*
+ * Apparently, on NetBSD when the child dies, the pipe begins
+ * receiving empty data packets *before* waitpid() has signaled
+ * that the child has died. Also, notice that this happens
+ * without any error bit being set in pollfd.revents (is this a
+ * NetBSD bug???). Notice that these anomalous packets exist
+ * according to poll(), but have length 0 according to read().
+ * Thus, kde can remain stuck inside this loop.
+ *
+ * A solution to this problem is to get out of the inner loop
+ * when read() returns <=0. In this way, kde has another chance
+ * to call waitpid() to check if the child has died -- and this
+ * time the call should succeed.
+ *
+ * Setting POLLHUP in pollfd.revents is not necessary, but I just
+ * like the idea of signaling that something strange has
+ * happened.
+ */
+ pollerr.revents |= POLLHUP;
+ break;
+ }
}
}
else if (pollstatus == -1) {