Bug #12057
closedWriting part of the string to stderr makes zlogin exit
100%
Description
Login to running zone with zlogin and run the following sample program:
#include <stdio.h> int main() { char *word="."; fputs(&word[1], stderr); fflush(stderr); return 0; }
Console session will be terminated with SIGHUP.
Reproducible on illumos-ad3e6d4dd8 (November 2019).
Related issues
Updated by Alexander Pyhalov over 3 years ago
Bug is reproducible as early as https://github.com/illumos/illumos-gate/commit/c79df70e7f04e3742087189b820b431059193dfe (September 20) and not reproducible at https://github.com/illumos/illumos-gate/commit/582237e641696363bb029af5d31bf63b495e1b7d (August 15).
Perhaps, we can to bisect.
Updated by Andy Fiddaman over 3 years ago
A bit of dtracing shows that zlogin
is calling poll, and getting POLLRDNORM | POLLIN
for the zone side stdout, but then getting 0 returned from a subsequent read()
on the file descriptor which it handles as an EOF and closes the connection.
Changing zlogin.c:process_output() so that read() == 0 is not handled as an EOF makes zlogin stop exhibiting this problem.
What's strange is that this is happening on stdout and not stderr, yet the test program only triggers the problem when writing to stderr.
Updated by Andy Fiddaman over 3 years ago
The behaviour of zlogin
changes depending on whether it is built with gcc7 or gcc 4.4.4:
gcc 7¶
% pwd /data/omnios-build/omniosorg/bloody/illumos/usr/src/cmd/zlogin % make ... % pfexec ./zlogin test [Connected to zone 'test' pts/2] Last login: Wed Dec 11 13:45:06 2019 on pts/2 OmniOS 5.11 omnios-master-f3e2549426 December 2019 root@test:~# ./zcons .root@test:~# [Connection to zone 'test' pts/2 closed]
gcc 4.4.4¶
% PRIMARY_CC=gcc4,/opt/gcc-4.4.4/bin/gcc,gnu make ... % pfexec ./zlogin test [Connected to zone 'test' pts/2] Last login: Wed Dec 11 13:44:34 2019 on pts/2 OmniOS 5.11 omnios-master-f3e2549426 December 2019 root@test:~# ./zcons .root@test:~# root@test:~# logout [Connection to zone 'test' pts/2 closed]
Updated by Andy Fiddaman over 3 years ago
The problem here is not the compiler but rather that gcc7 is including values-xpg6.o
in the link for C99 and above.
The problem was exposed by
commit d3b5f56344d8bfcdd6cfb82446af0e5e55ad9ebe CommitDate: Fri Aug 16 01:57:38 2019 -0700 11528 Makefile.noget can get gone 11529 Use -Wno-maybe-initialized
because it changed zlogin to build with C99.
Building zlogin without the C99 flags produces a binary which does not exhibit this problem.
Updated by Andy Fiddaman over 3 years ago
Summary:
In August, a change (11529) that was cleaning up the use of -Wno-initialized in
various places changed the zlogin Makefile to use -std=gnu99 instead of
-std=gnu98. This caused the illumos version of gcc7 to link values-xpg6.o into
the final object which has a number of side-effects.
Most important for zlogin is that when read() on a terminal returns 0, it no
longer means EOF, just that no data is available.
Updated by Electric Monk over 3 years ago
- Status changed from New to Closed
- % Done changed from 0 to 100
git commit 7b2eb3f3c068e560c7357b0f314172448bb8d1e0
commit 7b2eb3f3c068e560c7357b0f314172448bb8d1e0 Author: Andy Fiddaman <omnios@citrus-it.co.uk> Date: 2019-12-19T11:28:29.000Z 12057 Writing part of the string to stderr makes zlogin exit Reviewed by: John Levon <john.levon@joyent.com> Reviewed by: Toomas Soome <tsoome@me.com> Reviewed by: Alexander Pyhalov <apyhalov@gmail.com> Approved by: Dan McDonald <danmcd@joyent.com>
Updated by Gergő Mihály Doma over 3 years ago
- Related to Bug #12286: Terminal gets SIGHUP in Global Zone after 'npm' command is run added
Updated by Andy Fiddaman over 3 years ago
- Related to Bug #12306: XPG4v2 slave pty behaviour should generally be disabled added