Collin Funk <[email protected]> writes:

>> Note 3: Regardless whether the tee(1) infloop happens or not, the terminal 
>> is showing
>> some debris after terminating tee(1):
>>
>>   
>> :1+r6E616D65=787465726D2D323536636F6C6F72^[\^[[8;61;270t^[[61;10R^[[61;270R^[[8;61;270t^[[61;1R^[[61;270R
>
> This one confuses me, since I also see it with coreutils-9.10. Perhaps
> it is a bug that was introduced earlier than the previously discussed
> commit?

I think it is safe to ignore. It will be printed if you run the
following command:

    $ cat typescript
    [...]
    $ 
:1+r6E616D65=787465726D2D323536636F6C6F72^[\^[[8;57;254t^[[57;10R^[[57;254R^[[8;57;254t^[[57;1R^[[57;254R

It is caused by this line:

    $ sed -n 197p typescript
    2nd stage started in virtual machine
    $ 
:1+r6E616D65=787465726D2D323536636F6C6F72^[\^[[8;57;254t^[[57;10R^[[57;254R^[[8;57;254t^[[57;1R^[[57;254R
    $ sed 197d typescript
    [...]
    $ hello
    Hello, world!

While looking at this code again, I wonder if write_wait should be
written a bit more defensively. E.g., like this:

diff --git a/src/iopoll.c b/src/iopoll.c
index de20bc8d9..93895bd48 100644
--- a/src/iopoll.c
+++ b/src/iopoll.c
@@ -208,23 +208,23 @@ close_wait (int fd)
 /* wrapper for write() that also waits for FD if non blocking.  */
 
 extern bool
-write_wait (int fd, void const *buffer, size_t size)
+write_wait (int fd, void const *buffer, ssize_t size)
 {
   unsigned char const *buf = buffer;
 
-  while (true)
+  while (0 < size)
     {
       ssize_t written = write (fd, buf, size);
-      if (written < 0)
-        written = 0;
-
-      size -= written;
-      if (size <= 0)  /* everything written */
-        return true;
-
-      if (! wait_for_nonblocking_write (fd))
-        return false;
-
+      if (written <= 0)
+        {
+          /* Continue if FD becomes writable.  */
+          if (wait_for_nonblocking_write (fd))
+            continue;
+          return false;
+        }
       buf += written;
+      size -= written;
     }
+
+  return true;
 }

Is it possible/common for write to return zero bytes when the given size
is greater than zero?

Collin



Reply via email to