[prev in list] [next in list] [prev in thread] [next in thread] 

List:       konsole-devel
Subject:    Re: Review Request 129984: Prevent misdetection of EOF on Linux
From:       Kurt Hindenburg <kurt.hindenburg () gmail ! com>
Date:       2017-03-08 2:04:22
Message-ID: 20170308020422.13092.89535 () mimi ! kde ! org
[Download RAW message or body]

--===============4823119506918845884==
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://git.reviewboard.kde.org/r/129984/#review102758
-----------------------------------------------------------



Since this changes kpty, it needs to get reviewed on https://phabricator.kde.org/ - \
can you please open a request there?

- Kurt Hindenburg


On March 4, 2017, 10:56 p.m., Peter Wu wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://git.reviewboard.kde.org/r/129984/
> -----------------------------------------------------------
> 
> (Updated March 4, 2017, 10:56 p.m.)
> 
> 
> Review request for Konsole and Kurt Hindenburg.
> 
> 
> Bugs: 372991
> https://bugs.kde.org/show_bug.cgi?id=372991
> 
> 
> Repository: kpty
> 
> 
> Description
> -------
> 
> On Linux, even if slave activity is detected on a master fd, FIONREAD
> can still return zero available bytes in the buffer. Previously this
> would prevent further signals from being emitted even if new IO arrived
> (since the readNotifier is disabled) which in its turn prevented the
> Konsole output from being updated.
> 
> A race condition in the kernel is suspected, the first known broken
> kernel is v4.1.10-89-g5eb491ba5d06.
> 
> BUG: 372991
> 
> 
> Diffs
> -----
> 
> src/kptydevice.cpp 22233a505d32d988795839cb592098c38f7fab33 
> 
> Diff: https://git.reviewboard.kde.org/r/129984/diff/
> 
> 
> Testing
> -------
> 
> Tested in conjunction with konsole v16.12.1-60-g151215a9 with this debug patch \
> applied: ```
> diff --git a/src/kptydevice.cpp b/src/kptydevice.cpp
> index 92b443b..4dfcd02 100644
> --- a/src/kptydevice.cpp
> +++ b/src/kptydevice.cpp
> @@ -273,6 +273,7 @@ struct KPtyDevicePrivate : public KPtyPrivate {
> KRingBuffer writeBuffer;
> };
> 
> +#include <cstdio>
> bool KPtyDevicePrivate::_k_canRead()
> {
> Q_Q(KPtyDevice);
> @@ -310,6 +311,9 @@ bool KPtyDevicePrivate::_k_canRead()
> // select() will trigger again anyway if an EOF condition was found, and
> // only then we will accept it.
> if (!available && !maybeEof) {
> +            FILE *fp = fopen("/tmp/EOF", "a");
> +            fprintf(fp, "Maybe EOF!?\n");
> +            fclose(fp);
> maybeEof = true;
> return true;
> } else if (available) {
> 
> ```
> 
> Indeed, the /tmp/EOF file is being written and the Konsole output no longer \
> "hangs". 
> Closing a tab (via EOF in bash or closing the tab) somehow does not trigger this \
> debug print, perhaps the watcher is disabled elsewhere. (This is an observation and \
> not a problem.) 
> 
> Thanks,
> 
> Peter Wu
> 
> 


--===============4823119506918845884==
MIME-Version: 1.0
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: 7bit




<html>
 <body>
  <div style="font-family: Verdana, Arial, Helvetica, Sans-Serif;">
   <table bgcolor="#f9f3c9" width="100%" cellpadding="12" style="border: 1px #c9c399 \
solid; border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px;">  \
<tr>  <td>
      This is an automatically generated e-mail. To reply, visit:
      <a href="https://git.reviewboard.kde.org/r/129984/">https://git.reviewboard.kde.org/r/129984/</a>
  </td>
    </tr>
   </table>
   <br />





 <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: \
-pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;"><p style="padding: \
0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">Since \
this changes kpty, it needs to get reviewed on https://phabricator.kde.org/ - can you \
please open a request there?</p></pre>  <br />









<p>- Kurt Hindenburg</p>


<br />
<p>On March 4th, 2017, 10:56 p.m. UTC, Peter Wu wrote:</p>








<table bgcolor="#fefadf" width="100%" cellspacing="0" cellpadding="12" style="border: \
1px #888a85 solid; border-radius: 6px; -moz-border-radius: 6px; \
-webkit-border-radius: 6px;">  <tr>
  <td>

<div>Review request for Konsole and Kurt Hindenburg.</div>
<div>By Peter Wu.</div>


<p style="color: grey;"><i>Updated March 4, 2017, 10:56 p.m.</i></p>







<div style="margin-top: 1.5em;">
 <b style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Bugs: </b>


 <a href="https://bugs.kde.org/show_bug.cgi?id=372991">372991</a>


</div>



<div style="margin-top: 1.5em;">
 <b style="color: #575012; font-size: 10pt;">Repository: </b>
kpty
</div>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Description </h1>
 <table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" \
style="border: 1px solid #b8b5a0">  <tr>
  <td>
   <pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: \
-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: \
break-word;">On Linux, even if slave activity is detected on a master fd, FIONREAD \
can still return zero available bytes in the buffer. Previously this would prevent \
further signals from being emitted even if new IO arrived (since the readNotifier is \
disabled) which in its turn prevented the Konsole output from being updated.

A race condition in the kernel is suspected, the first known broken
kernel is v4.1.10-89-g5eb491ba5d06.

BUG: 372991</pre>
  </td>
 </tr>
</table>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Testing </h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: \
1px solid #b8b5a0">  <tr>
  <td>
   <pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: \
-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: \
break-word;"><p style="padding: 0;text-rendering: inherit;margin: 0;line-height: \
inherit;white-space: inherit;">Tested in conjunction with konsole \
v16.12.1-60-g151215a9 with this debug patch applied:</p> <p style="padding: \
0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;"><div \
class="codehilite" style="background: #f8f8f8"><pre style="line-height: \
125%"><span></span><span style="color: #000080; font-weight: bold">diff --git \
a/src/kptydevice.cpp b/src/kptydevice.cpp</span> <span style="color: #000080; \
font-weight: bold">index 92b443b..4dfcd02 100644</span> <span style="color: \
#A00000">--- a/src/kptydevice.cpp</span> <span style="color: #00A000">+++ \
b/src/kptydevice.cpp</span> <span style="color: #800080; font-weight: bold">@@ -273,6 \
+273,7 @@ struct KPtyDevicePrivate : public KPtyPrivate {</span>  KRingBuffer \
writeBuffer;  };

<span style="color: #00A000">+#include &lt;cstdio&gt;</span>
 bool KPtyDevicePrivate::_k_canRead()
 {
     Q_Q(KPtyDevice);
<span style="color: #800080; font-weight: bold">@@ -310,6 +311,9 @@ bool \
                KPtyDevicePrivate::_k_canRead()</span>
         // select() will trigger again anyway if an EOF condition was found, and
         // only then we will accept it.
         if (!available &amp;&amp; !maybeEof) {
<span style="color: #00A000">+            FILE *fp = fopen(&quot;/tmp/EOF&quot;, \
&quot;a&quot;);</span> <span style="color: #00A000">+            fprintf(fp, \
&quot;Maybe EOF!?\n&quot;);</span> <span style="color: #00A000">+            \
fclose(fp);</span>  maybeEof = true;
             return true;
         } else if (available) {
</pre></div>
</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: \
inherit;white-space: inherit;">Indeed, the /tmp/EOF file is being written and the \
Konsole output no longer "hangs".</p> <p style="padding: 0;text-rendering: \
inherit;margin: 0;line-height: inherit;white-space: inherit;">Closing a tab (via EOF \
in bash or closing the tab) somehow does not trigger this debug print, perhaps the \
watcher is disabled elsewhere. (This is an observation and not a problem.)</p></pre>  \
</td>  </tr>
</table>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Diffs</b> </h1>
<ul style="margin-left: 3em; padding-left: 0;">

 <li>src/kptydevice.cpp <span style="color: \
grey">(22233a505d32d988795839cb592098c38f7fab33)</span></li>

</ul>

<p><a href="https://git.reviewboard.kde.org/r/129984/diff/" style="margin-left: \
3em;">View Diff</a></p>






  </td>
 </tr>
</table>







  </div>
 </body>
</html>


--===============4823119506918845884==--


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic