GNU/Linux >> Belajar Linux >  >> Linux

Sesi Openssh Dibunuh Ketika Dari Perl Panggilan Syswrite Dibuat Dengan Variabel Kosong Di Solaris 11?

Kami memiliki masalah aneh di Solaris 11.4.

Masalah muncul ketika kode seperti berikut dijalankan dari Perl

my $emptystring = "";
syswrite STDOUT, $emptystring;

Eksekusi panggilan syswrite dengan variabel kosong memicu sesi OpenSSH dimatikan

Masalahnya baru bagi kami, dan muncul setelah migrasi dari Solaris 11.3 ke Solaris 11.4 dan dengan OpenSSH 8.1 (dengan versi 7.9 sebelumnya masalahnya tidak ada di sana)

Kesalahan ini terjadi hanya jika keluarannya adalah keluaran standar . Jika output skrip diarahkan ke file, semuanya berfungsi dengan baik

Jika skrip dilacak dengan truss kesalahan terjadi dalam write panggil seperti ini:

23886:  write(1, 0x004B6450, 0)             = 0

Panggilan tulis yang ditampilkan adalah ketika semuanya baik-baik saja, ketika kesalahan muncul, sesi dihentikan dan output truss dihentikan dan baris ini dan semuanya setelahnya tidak ditampilkan.

Info selengkapnya: Kami telah menguji binari yang dikompilasi untuk Solaris 11.3 dan berhasil!. Jadi ternyata masalahnya berasal dari kompilasi kami, tapi kami belum tahu kenapa…. Di lanjutkan …

Info selengkapnya: Tidak ada perbedaan yang mencolok antara kompilasi la. Log server OpenSSH tunjukkan bahwa nilai kosong diambil sebagai EOF , seperti yang dapat kita lihat pada gambar berikut, yang menunjukkan perbedaan antara OpenSSH dengan bug ini dan bug lain yang berperilaku benar.

Baris yang menunjukkannya adalah sebagai berikut:

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

Ada ide?

Jawaban yang Diterima:

Solusi ditemukan! Singkatnya, kita harus mengatur flag C PTY_ZEROREAD dalam fase konfigurasi kompilasi .

Di channels.c file source code te kita bisa lihat dimana letak errornya…

#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;
    }

Dan kita dapat melihat bahwa flag kompilasi PTY_ZEROREAD mengubah cara pesan panjang nol diperlakukan di terminal.

Terkait:Linux – Mengapa sesi ssh segera berakhir?

Untuk memecahkan masalah configure perintah harus dilakukan dengan set bendera C seperti yang ditunjukkan pada baris terakhir dari perintah berikut:

./configure --with-zlib           \
        --with-pam                \
        --with-md5-passwords      \
        CFLAGS="-DPTY_ZEROREAD=1"

Linux
  1. `$xauthority` Muncul Dari 'nowhere' Di Su+tmux?

  2. Tangkapan Layar X Dari Tty?

  3. Bagaimana Cara Membuat Vm Dari Awal Dengan Virsh?

  1. memanggil fungsi ketika program selesai dengan ctrl c

  2. Mendefinisikan variabel dengan atau tanpa ekspor

  3. Alias ​​​​dengan variabel di bash

  1. Apa cara yang benar untuk membuat aplikasi PyQt saya berhenti saat dimatikan dari konsol (Ctrl-C)?

  2. Batalkan panggilan sistem dengan ptrace()

  3. Panggil skrip Python dari bash dengan argumen