Nous avons un problème étrange dans Solaris 11.4.
Le problème survient lorsqu'un code comme celui-ci est exécuté à partir de Perl
my $emptystring = "";
syswrite STDOUT, $emptystring;
L'exécution d'un appel syswrite avec une variable vide provoque la fermeture de la session OpenSSH 🙁
Le problème est nouveau pour nous, et il est apparu après la migration de Solaris 11.3 vers Solaris 11.4 et avec OpenSSH 8.1 (avec la version 7.9 précédente, le problème n'est pas là)
Cette erreur se produit uniquement si la sortie est la sortie standard . Si la sortie du script est redirigée vers un fichier tout fonctionne bien
Si le script est tracé avec truss
l'erreur se produit dans un write
appeler comme celui-ci :
23886: write(1, 0x004B6450, 0) = 0
L'appel d'écriture affiché est pour quand tout va bien, lorsque l'erreur survient, la session est tuée et la sortie du truss est arrêtée et cette ligne et tout ce qui suit n'est pas affiché.
Plus d'informations : Nous avons testé des binaires compilés pour Solaris 11.3 et ils fonctionnent !. Donc apparemment le problème vient de notre compilation, mais on ne sait pas encore pourquoi…. Sur continuer …
Plus d'informations : Il n'y a pas de différence notable entre la compilation. Les logs du serveur OpenSSH montrer que la valeur vide est considérée comme un EOF , comme on peut le voir dans l'image suivante, qui montre la différence entre un OpenSSH avec ce bogue et un autre qui se comporte correctement.
Les lignes qui l'affichent sont les suivantes :
debug2: channel 0: read<=0 rfd 16 len 0
debug2: channel 0: read failed
debug2: channel 0: chan_shutdown_read (i0 o0 sock -1 wfd 16 efd -1 [closed])
debug2: channel 0: input open -> drain
debug2: channel 0: ibuf empty
debug2: channel 0: send eof
debug3: send packet: type 96
debug2: channel 0: input drain -> closed
Une idée ?
Réponse acceptée :
Solution trouvée ! 🙂 En bref, nous devons définir le drapeau C PTY_ZEROREAD
dans la phase de configuration de la compilation .
Dans channels.c
fichier du code source, nous pouvons voir où l'erreur est générée …
#ifndef PTY_ZEROREAD
if (len <= 0) {
#else
if ((!c->isatty && len <= 0) ||
(c->isatty && (len < 0 || (len == 0 && errno != 0)))) {
#endif
debug2("channel %d: read<=0 rfd %d len %zd",
c->self, c->rfd, len);
if (c->type != SSH_CHANNEL_OPEN) {
debug2("channel %d: not open", c->self);
chan_mark_dead(ssh, c);
return -1;
} else {
chan_read_failed(ssh, c);
}
return -1;
}
Et nous pouvons voir que le drapeau de compilation PTY_ZEROREAD
modifie la façon dont les messages de longueur nulle sont traités dans les terminaux.
Pour résoudre le problème, le configure
La commande doit être effectuée avec le drapeau C défini comme indiqué dans la dernière ligne de la commande suivante :
./configure --with-zlib \
--with-pam \
--with-md5-passwords \
CFLAGS="-DPTY_ZEROREAD=1"